Path: blob/master/RSDKv5/RSDK/Graphics/Drawing.hpp
1163 views
#ifndef DRAWING_H1#define DRAWING_H23namespace RSDK4{56#define SURFACE_COUNT (0x40)78#ifndef SCREEN_COUNT9#if RETRO_REV0210#define SCREEN_COUNT (4)11#else12#define SCREEN_COUNT (2)13#endif14#endif15#define CAMERA_COUNT (4)1617#define DEFAULT_PIXWIDTH (424)1819#define LAYER_COUNT (8)20#define DRAWGROUP_COUNT (16)2122#define SHADER_COUNT (0x20)2324// Also for "Images" but it's a cleaner name as is25#define RETRO_VIDEO_TEXTURE_W (1024)26#define RETRO_VIDEO_TEXTURE_H (512)2728enum InkEffects {29INK_NONE,30INK_BLEND,31INK_ALPHA,32INK_ADD,33INK_SUB,34INK_TINT,35INK_MASKED,36INK_UNMASKED,37};3839enum DrawFX { FX_NONE = 0, FX_FLIP = 1, FX_ROTATE = 2, FX_SCALE = 4 };4041enum FlipFlags { FLIP_NONE, FLIP_X, FLIP_Y, FLIP_XY };4243enum Alignments {44ALIGN_LEFT,45ALIGN_RIGHT,46ALIGN_CENTER,47};4849enum WindowStates {50WINDOWSTATE_UNINITIALIZED,51WINDOWSTATE_ACTIVE,52WINDOWSTATE_INACTIVE,53};5455enum ShaderIDs {56SHADER_NONE,57SHADER_CLEAN,58SHADER_CRT_YEETRON,59SHADER_CRT_YEE64,60SHADER_YUV_420,61SHADER_YUV_422,62SHADER_YUV_444,63SHADER_RGB_IMAGE,64};6566struct GFXSurface {67RETRO_HASH_MD5(hash);68uint8 *pixels;69int32 height;70int32 width;71int32 lineSize;72uint8 scope;73};7475struct ScreenInfo {76// uint16 *frameBuffer;77uint16 frameBuffer[SCREEN_XMAX * SCREEN_YSIZE];78Vector2 position;79Vector2 size;80Vector2 center;81int32 pitch;82int32 clipBound_X1;83int32 clipBound_Y1;84int32 clipBound_X2;85int32 clipBound_Y2;86int32 waterDrawPos;87};8889struct CameraInfo {90Vector2 *targetPos;91Vector2 position;92Vector2 offset;93bool32 worldRelative;94};9596struct DrawList {97uint16 entries[ENTITY_COUNT];98uint16 layerDrawList[LAYER_COUNT];99void (*hookCB)();100bool32 sorted;101int32 entityCount;102int32 layerCount;103};104105struct VideoSettings {106uint8 windowed;107uint8 bordered;108uint8 exclusiveFS;109uint8 vsync;110uint8 tripleBuffered;111uint8 shaderSupport;112int32 fsWidth;113int32 fsHeight;114int32 refreshRate;115int32 windowWidth;116int32 windowHeight;117int32 pixWidth;118int32 pixHeight;119int32 windowState;120int32 shaderID;121int32 screenCount;122uint32 dimTimer;123uint32 dimLimit;124float dimMax;125float dimPercent;126float viewportW;127float viewportH;128float viewportX;129float viewportY;130};131132enum VideoSettingsValues {133VIDEOSETTING_WINDOWED,134VIDEOSETTING_BORDERED,135VIDEOSETTING_EXCLUSIVEFS,136VIDEOSETTING_VSYNC,137VIDEOSETTING_TRIPLEBUFFERED,138VIDEOSETTING_WINDOW_WIDTH,139VIDEOSETTING_WINDOW_HEIGHT,140VIDEOSETTING_FSWIDTH,141VIDEOSETTING_FSHEIGHT,142VIDEOSETTING_REFRESHRATE,143VIDEOSETTING_SHADERSUPPORT,144VIDEOSETTING_SHADERID,145VIDEOSETTING_SCREENCOUNT,146#if RETRO_REV02147VIDEOSETTING_DIMTIMER,148#endif149VIDEOSETTING_STREAMSENABLED,150VIDEOSETTING_STREAM_VOL,151VIDEOSETTING_SFX_VOL,152VIDEOSETTING_LANGUAGE,153VIDEOSETTING_STORE,154VIDEOSETTING_RELOAD,155VIDEOSETTING_CHANGED,156VIDEOSETTING_WRITE,157};158159struct float4 {160float x;161float y;162float z;163float w;164};165166struct float3 {167float x;168float y;169float z;170};171172struct float2 {173float x;174float y;175};176177struct RenderVertex {178float3 pos;179uint32 color;180float2 tex;181};182183struct ShaderEntryBase {184uint8 linear;185char name[0x20];186};187188class RenderDeviceBase189{190public:191static bool Init();192static void CopyFrameBuffer();193static void ProcessDimming();194static void FlipScreen();195static void Release(bool32 isRefresh);196197static void RefreshWindow();198199static void SetupImageTexture(int32 width, int32 height, uint8 *imagePixels);200static void SetupVideoTexture_YUV420(int32 width, int32 height, uint8 *imagePixels);201static void SetupVideoTexture_YUV422(int32 width, int32 height, uint8 *imagePixels);202static void SetupVideoTexture_YUV424(int32 width, int32 height, uint8 *imagePixels);203204static bool ProcessEvents();205206static void InitFPSCap();207static bool CheckFPSCap();208static void UpdateFPSCap();209210// Public since it's needed for the ModAPI211static bool InitShaders();212static void LoadShader(const char *fileName, bool32 linear);213214// ====================215// RSDK COMMON START216// ====================217218static bool32 isRunning;219static int32 windowRefreshDelay;220221static int32 displayWidth[16];222static int32 displayHeight[16];223static int32 displayCount;224225static int32 lastShaderID;226227#if RETRO_REV02228static uint8 startVertex_2P[];229static uint8 startVertex_3P[];230#endif231232static float2 pixelSize;233static float2 textureSize;234static float2 viewSize;235236private:237static bool SetupRendering();238static void InitVertexBuffer();239static bool InitGraphicsAPI();240241static void GetDisplays();242};243244#if RETRO_RENDERDEVICE_DIRECTX9245#include "DX9/DX9RenderDevice.hpp"246#elif RETRO_RENDERDEVICE_DIRECTX11247#include "DX11/DX11RenderDevice.hpp"248#elif RETRO_RENDERDEVICE_SDL2249#include "SDL2/SDL2RenderDevice.hpp"250#elif RETRO_RENDERDEVICE_GLFW251#include "GLFW/GLFWRenderDevice.hpp"252#elif RETRO_RENDERDEVICE_VK253#include "Vulkan/VulkanRenderDevice.hpp"254#elif RETRO_RENDERDEVICE_EGL255#include "EGL/EGLRenderDevice.hpp"256#endif257258extern DrawList drawGroups[DRAWGROUP_COUNT];259extern char drawGroupNames[0x10][0x10];260261extern uint16 blendLookupTable[0x20 * 0x100];262extern uint16 subtractLookupTable[0x20 * 0x100];263264extern GFXSurface gfxSurface[SURFACE_COUNT];265266extern float dpi;267extern int32 cameraCount;268extern ScreenInfo screens[SCREEN_COUNT];269extern CameraInfo cameras[CAMERA_COUNT];270extern ScreenInfo *currentScreen;271272extern int32 shaderCount;273extern ShaderEntry shaderList[SHADER_COUNT];274275extern VideoSettings videoSettings;276extern VideoSettings videoSettingsBackup;277extern bool32 changedVideoSettings;278279#if RETRO_USE_MOD_LOADER280extern int32 userShaderCount;281#else282#define userShaderCount (4)283#endif284285void UpdateGameWindow();286287void GenerateBlendLookupTable();288289void InitSystemSurfaces();290291void GetDisplayInfo(int32 *displayID, int32 *width, int32 *height, int32 *refreshRate, char *text);292void GetWindowSize(int32 *width, int32 *height);293294#if RETRO_REV02295inline void SetScreenVertices(uint8 startVert2P_S1, uint8 startVert2P_S2, uint8 startVert3P_S1, uint8 startVert3P_S2, uint8 startVert3P_S3)296{297RenderDevice::startVertex_2P[0] = startVert2P_S1;298RenderDevice::startVertex_2P[1] = startVert2P_S2;299300RenderDevice::startVertex_3P[0] = startVert3P_S1;301RenderDevice::startVertex_3P[1] = startVert3P_S2;302RenderDevice::startVertex_3P[2] = startVert3P_S3;303}304#endif305306void SetScreenSize(uint8 screenID, uint16 width, uint16 height);307308inline void AddCamera(Vector2 *targetPos, int32 offsetX, int32 offsetY, bool32 worldRelative)309{310if (cameraCount < CAMERA_COUNT) {311cameras[cameraCount].targetPos = targetPos;312cameras[cameraCount].offset.x = offsetX;313cameras[cameraCount].offset.y = offsetY;314cameras[cameraCount].worldRelative = worldRelative;315316++cameraCount;317}318}319320inline void ClearCameras() { cameraCount = 0; }321322inline void SetClipBounds(uint8 screenID, int32 x1, int32 y1, int32 x2, int32 y2)323{324ScreenInfo *screen;325326if (screenID < SCREEN_COUNT) {327screen = &screens[screenID];328329screen->clipBound_X1 = CLAMP(x1, 0, screen->size.x);330screen->clipBound_Y1 = CLAMP(y1, 0, screen->size.y);331screen->clipBound_X2 = CLAMP(x2, 0, screen->size.x);332screen->clipBound_Y2 = CLAMP(y2, 0, screen->size.y);333}334}335336int32 GetVideoSetting(int32 id);337void SetVideoSetting(int32 id, int32 value);338339inline void AddDrawListRef(uint8 drawGroup, uint16 entityID)340{341if (drawGroup < DRAWGROUP_COUNT)342drawGroups[drawGroup].entries[drawGroups[drawGroup].entityCount++] = entityID;343}344345inline uint16 GetDrawListRefSlot(uint8 drawGroup, uint16 listPos)346{347DrawList *list = &drawGroups[drawGroup];348if (drawGroup < DRAWGROUP_COUNT && listPos < list->entityCount)349return list->entries[listPos];350351return 0;352}353354inline Entity *GetDrawListRef(uint8 drawGroup, uint16 listPos)355{356DrawList *listPtr = &drawGroups[drawGroup];357if (drawGroup < DRAWGROUP_COUNT && listPos < listPtr->entityCount)358return &objectEntityList[listPtr->entries[listPos]];359360return NULL;361}362363inline void SetDrawGroupProperties(uint8 drawGroup, bool32 sorted, void (*hookCB)())364{365if (drawGroup < DRAWGROUP_COUNT) {366DrawList *list = &drawGroups[drawGroup];367list->sorted = sorted;368list->hookCB = hookCB;369}370}371372void SwapDrawListEntries(uint8 drawGroup, uint16 slot1, uint16 slot2, uint16 count);373374void FillScreen(uint32 color, int32 alphaR, int32 alphaG, int32 alphaB);375376void DrawLine(int32 x1, int32 y1, int32 x2, int32 y2, uint32 color, int32 alpha, int32 inkEffect, bool32 screenRelative);377void DrawRectangle(int32 x, int32 y, int32 width, int32 height, uint32 color, int32 alpha, int32 inkEffect, bool32 screenRelative);378void DrawCircle(int32 x, int32 y, int32 radius, uint32 color, int32 alpha, int32 inkEffect, bool32 screenRelative);379void DrawCircleOutline(int32 x, int32 y, int32 innerRadius, int32 outerRadius, uint32 color, int32 alpha, int32 inkEffect, bool32 screenRelative);380381void DrawFace(Vector2 *vertices, int32 vertCount, int32 r, int32 g, int32 b, int32 alpha, int32 inkEffect);382void DrawBlendedFace(Vector2 *vertices, uint32 *colors, int32 vertCount, int32 alpha, int32 inkEffect);383384void DrawSprite(Animator *animator, Vector2 *position, bool32 screenRelative);385void DrawSpriteFlipped(int32 x, int32 y, int32 width, int32 height, int32 sprX, int32 sprY, int32 direction, int32 inkEffect, int32 alpha,386int32 sheetID);387void DrawSpriteRotozoom(int32 x, int32 y, int32 pivotX, int32 pivotY, int32 width, int32 height, int32 sprX, int32 sprY, int32 scaleX, int32 scaleY,388int32 direction, int16 Rotation, int32 inkEffect, int32 alpha, int32 sheetID);389390void DrawDeformedSprite(uint16 sheetID, int32 inkEffect, int32 alpha);391392void DrawTile(uint16 *tileInfo, int32 countX, int32 countY, Vector2 *position, Vector2 *offset, bool32 screenRelative);393void DrawAniTile(uint16 sheetID, uint16 tileIndex, uint16 srcX, uint16 srcY, uint16 width, uint16 height);394395#if RETRO_REV0U || RETRO_USE_MOD_LOADER396inline void DrawDynamicAniTile(Animator *animator, uint16 tileIndex)397{398if (animator->frames) {399SpriteFrame *frame = &animator->frames[animator->frameID];400DrawAniTile(frame->sheetID, tileIndex, frame->sprX, frame->sprY, frame->width, frame->height);401}402}403#endif404405void DrawString(Animator *animator, Vector2 *position, String *string, int32 endFrame, int32 textLength, int32 align, int32 spacing, void *unused,406Vector2 *charPositions, bool32 screenRelative);407void DrawDevString(const char *string, int32 x, int32 y, int32 align, uint32 color);408409inline void ClearGfxSurfaces()410{411// Unload sprite sheets412for (int32 s = 0; s < SURFACE_COUNT; ++s) {413if (gfxSurface[s].scope != SCOPE_GLOBAL) {414MEM_ZERO(gfxSurface[s]);415gfxSurface[s].scope = SCOPE_NONE;416}417}418}419420#if RETRO_REV0U421#include "Legacy/DrawingLegacy.hpp"422#endif423424} // namespace RSDK425426#endif // !DRAWING_H427428429