1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-11-15 23:49:42 +01:00
VVVVVV/desktop_version/src/Graphics.h

326 lines
6.9 KiB
C
Raw Normal View History

2020-01-01 21:29:24 +01:00
#ifndef GRAPHICS_H
#define GRAPHICS_H
#include <algorithm>
#include <map>
2020-01-01 21:29:24 +01:00
#include <string>
#include <vector>
2020-01-01 21:29:24 +01:00
#include "GraphicsResources.h"
2020-01-01 21:29:24 +01:00
#include "GraphicsUtil.h"
#include "Maths.h"
2020-01-01 21:29:24 +01:00
#include "Screen.h"
#include "Textbox.h"
#include "TowerBG.h"
2020-01-01 21:29:24 +01:00
class Graphics
{
public:
Allow using help/graphics/music/game/key/map/obj everywhere This commit makes `help`, `graphics`, `music`, `game`, `key`, `map`, and `obj` essentially static global objects that can be used everywhere. This is useful in case we ever need to add a new function in the future, so we don't have to bother with passing a new argument in which means we have to pass a new argument in to the function that calls that function which means having to pass a new argument into the function that calls THAT function, etc. which is a real headache when working on fan mods of the source code. Note that this changes NONE of the existing function signatures, it merely just makes those variables accessible everywhere in the same way `script` and `ed` are. Also note that some classes had to be initialized after the filesystem was initialized, but C++ would keep initializing them before the filesystem got initialized, because I *had* to put them at the top of `main.cpp`, or else they wouldn't be global variables. The only way to work around this was to use entityclass's initialization style (which I'm pretty sure entityclass of all things doesn't need to be initialized this way), where you actually initialize the class in an `init()` function, and so then you do `graphics.init()` after the filesystem initialization, AFTER doing `Graphics graphics` up at the top. I've had to do this for `graphics` (but only because its child GraphicsResources `grphx` needs to be initialized this way), `music`, and `game`. I don't think this will affect anything. Other than that, `help`, `key`, and `map` are still using the C++-intended method of having ClassName::ClassName() functions.
2020-01-29 08:35:03 +01:00
void init();
void destroy();
2020-01-01 21:29:24 +01:00
void create_buffers(const SDL_PixelFormat* fmt);
void destroy_buffers();
2020-01-01 21:29:24 +01:00
GraphicsResources grphx;
2020-02-11 06:48:07 +01:00
int bfontlen(uint32_t ch);
int font_idx(uint32_t ch);
2020-01-01 21:29:24 +01:00
void Makebfont();
void drawhuetile(int x, int y, int t);
void huetilesetcol(int t);
Uint32 bigchunkygetcol(int t);
2020-01-01 21:29:24 +01:00
void drawgravityline(int t);
2020-01-01 21:29:24 +01:00
void MakeTileArray();
void MakeSpriteArray();
void maketelearray();
void drawcoloredtile(int x, int y, int t, int r, int g, int b);
void drawmenu(int cr, int cg, int cb, bool levelmenu = false);
2020-01-01 21:29:24 +01:00
void processfade();
void drawfade();
void setwarprect(int a, int b, int c, int d);
void createtextbox(std::string t, int xp, int yp, int r= 255, int g= 255, int b = 255);
2020-01-01 21:29:24 +01:00
void textboxcenterx();
int textboxwidth();
void textboxmoveto(int xo);
void textboxcentery();
void textboxadjust();
void addline(std::string t);
void textboxtimer(int t);
void textboxremove();
void textboxremovefast();
void textboxactive();
void drawtextbox(int x, int y, int w, int h, int r, int g, int b);
void drawpixeltextbox(int x, int y, int w, int h, int w2, int h2, int r, int g, int b, int xo, int yo);
void drawcustompixeltextbox(int x, int y, int w, int h, int w2, int h2, int r, int g, int b, int xo, int yo);
void drawcrewman(int x, int y, int t, bool act, bool noshift =false);
2020-01-01 21:29:24 +01:00
int crewcolour(const int t);
void cutscenebars();
void cutscenebarstimer();
2020-01-01 21:29:24 +01:00
void drawpartimage(int t, int xp, int yp, int wp, int hp);
void drawimage(int t, int xp, int yp, bool cent=false);
void drawimagecol(int t, int xp, int yp, int r, int g, int b, bool cent= false);
void updatetextboxes();
void drawgui();
2020-01-01 21:29:24 +01:00
void drawsprite(int x, int y, int t, int r, int g, int b);
void drawsprite(int x, int y, int t, Uint32 c);
2020-01-01 21:29:24 +01:00
void printcrewname(int x, int y, int t);
void printcrewnamestatus(int x, int y, int t);
void printcrewnamedark(int x, int y, int t);
void map_tab(int opt, const std::string& text, bool selected = false);
void map_option(int opt, int num_opts, const std::string& text, bool selected = false);
2020-01-01 21:29:24 +01:00
void Print(int _x, int _y, std::string _s, int r, int g, int b, bool cen = false);
void PrintAlpha(int _x, int _y, std::string _s, int r, int g, int b, int a, bool cen = false);
void PrintOffAlpha(int _x, int _y, std::string _s, int r, int g, int b, int a, bool cen = false);
2020-01-01 21:29:24 +01:00
void bprint(int x, int y, std::string t, int r, int g, int b, bool cen = false);
void bprintalpha(int x, int y, std::string t, int r, int g, int b, int a, bool cen = false);
2020-01-01 21:29:24 +01:00
int len(std::string t);
void bigprint( int _x, int _y, std::string _s, int r, int g, int b, bool cen = false, int sc = 2 );
void drawspritesetcol(int x, int y, int t, int c);
2020-01-01 21:29:24 +01:00
void flashlight();
void screenshake();
void updatescreenshake();
int screenshake_x;
int screenshake_y;
2020-01-01 21:29:24 +01:00
void render();
void renderwithscreeneffects();
2020-01-01 21:29:24 +01:00
bool Hitest(SDL_Surface* surface1, point p1, SDL_Surface* surface2, point p2);
2020-01-01 21:29:24 +01:00
void drawentities();
2020-01-01 21:29:24 +01:00
void drawentity(const int i, const int yoff);
void drawtrophytext();
2020-01-01 21:29:24 +01:00
void bigrprint(int x, int y, std::string& t, int r, int g, int b, bool cen = false, float sc = 2);
Fix, for in-GAMEMODE sprites, their colors updating too fast Okay, so the problem here is that Graphics::setcol() is called right before a sprite is drawn in a render function, but render functions are done in deltatime, meaning that the color of a sprite keeps being recalculated every time. This only affects sprites that use fRandom() (the other thing that can dynamically determine a color is help.glow, but that's only updated in the fixed-timestep loop), but is especially noticeable for sprites that flash wildly, like the teleporter, trinket, and elephant. To fix this, we need to make the color be recalculated only in the fixed-timestep loop. However, this means that we MUST store the color of the sprite SOMEWHERE for the delta-timesteps to render it, otherwise the color calculation will just be lost or something. So each entity now has a new attribute, `realcol`, which is the actual raw color used to render the sprite in render functions. This is not to be confused with their `colour` attribute, which is more akin to a color "ID" of sorts, but which isn't an actual color. At the end of gamelogic(), as well as when an entity is first created, the `colour` is given to Graphics::setcol() and then `realcol` gets set to the actual color. Then when it comes time to render the entity, `realcol` gets used instead. Gravitron squares are a somewhat tricky case where there's technically TWO colors for it - one is the actual sprite itself and the other is the indicator. However, usually the indicator and the square aren't both onscreen at the same time, so we can simply switch the realcol between the two as needed. However, we can't use this system for the sprite colors used on the title and map screen, so we'll have to do something else for those.
2020-05-01 02:34:37 +02:00
void drawtele(int x, int y, int t, Uint32 c);
2020-01-01 21:29:24 +01:00
Uint32 getRGBA(Uint8 r, Uint8 g, Uint8 b, Uint8 a);
2020-01-01 21:29:24 +01:00
Uint32 getRGB(Uint8 r, Uint8 g, Uint8 b);
Uint32 getBGR(Uint8 r, Uint8 g, Uint8 b);
Uint32 getRGB(Uint32 _col);
Uint32 RGBflip(Uint8 r, Uint8 g, Uint8 b);
Uint32 RGBf(int r, int g, int b);
void setcolreal(Uint32 t);
void drawbackground(int t);
void updatebackground(int t);
void drawtile3( int x, int y, int t, int off, int height_subtract = 0 );
void drawtile2( int x, int y, int t );
void drawtile( int x, int y, int t );
2020-01-01 21:29:24 +01:00
void drawtowertile( int x, int y, int t );
void drawtowertile3( int x, int y, int t, TowerBG& bg_obj );
2020-01-01 21:29:24 +01:00
void drawmap();
2020-01-01 21:29:24 +01:00
void drawforetile(int x, int y, int t);
void drawforetile2(int x, int y, int t);
void drawforetile3(int x, int y, int t, int off);
void drawrect(int x, int y, int w, int h, int r, int g, int b);
void drawtowermap();
2020-01-01 21:29:24 +01:00
void drawtowerspikes();
2020-01-01 21:29:24 +01:00
bool onscreen(int t);
void reloadresources();
std::string assetdir;
2020-01-01 21:29:24 +01:00
void menuoffrender();
void drawtowerbackground(const TowerBG& bg_obj);
void updatetowerbackground(TowerBG& bg_obj);
2020-01-01 21:29:24 +01:00
void setcol(int t);
void drawfinalmap();
2020-01-01 21:29:24 +01:00
colourTransform ct;
int rcol;
2020-01-01 21:29:24 +01:00
int m;
2020-01-01 21:29:24 +01:00
std::vector <SDL_Surface*> images;
std::vector <SDL_Surface*> tele;
std::vector <SDL_Surface*> tiles;
std::vector <SDL_Surface*> tiles2;
std::vector <SDL_Surface*> tiles3;
std::vector <SDL_Surface*> entcolours;
std::vector <SDL_Surface*> sprites;
std::vector <SDL_Surface*> flipsprites;
std::vector <SDL_Surface*> bfont;
std::vector <SDL_Surface*> flipbfont;
bool flipmode;
bool setflipmode;
bool notextoutline;
2020-01-01 21:29:24 +01:00
//buffer objects. //TODO refactor buffer objects
SDL_Surface* backBuffer;
Screen* screenbuffer;
SDL_Surface* menubuffer;
SDL_Surface* foregroundBuffer;
2020-01-01 21:29:24 +01:00
SDL_Surface* tempBuffer;
SDL_Surface* warpbuffer;
SDL_Surface* warpbuffer_lerp;
2020-01-01 21:29:24 +01:00
TowerBG towerbg;
TowerBG titlebg;
2020-01-01 21:29:24 +01:00
SDL_Rect bfont_rect;
SDL_Rect tiles_rect;
SDL_Rect sprites_rect;
SDL_Rect images_rect;
SDL_Rect bg_rect;
SDL_Rect line_rect;
SDL_Rect tele_rect;
SDL_Rect towerbuffer_rect;
2020-01-01 21:29:24 +01:00
SDL_Rect foot_rect;
SDL_Rect prect;
SDL_Rect footerrect;
SDL_Surface* footerbuffer;
2020-01-01 21:29:24 +01:00
int linestate, linedelay;
int backoffset;
bool backgrounddrawn, foregrounddrawn;
int menuoffset;
int oldmenuoffset;
2020-01-01 21:29:24 +01:00
bool resumegamemode;
SDL_Rect warprect;
int crewframe;
int crewframedelay;
int fademode;
int fadeamount;
int oldfadeamount;
int fadebars[15];
2020-01-01 21:29:24 +01:00
bool trinketcolset;
int trinketr, trinketg, trinketb;
std::vector <textboxclass> textbox;
bool showcutscenebars;
int cutscenebarspos;
int oldcutscenebarspos;
2020-01-01 21:29:24 +01:00
static const int numstars = 50;
SDL_Rect stars[numstars];
int starsspeed[numstars];
2020-01-01 21:29:24 +01:00
static const int numbackboxes = 18;
2020-01-01 21:29:24 +01:00
int spcol, spcoldel;
SDL_Rect backboxes[numbackboxes];
int backboxvx[numbackboxes];
int backboxvy[numbackboxes];
float backboxint[numbackboxes];
2020-01-01 21:29:24 +01:00
int warpskip, warpfcol, warpbcol;
bool translucentroomname;
bool showmousecursor;
std::map<int, int> font_positions;
SDL_Surface* ghostbuffer;
float inline lerp(const float v0, const float v1)
{
return v0 + alpha * (v1 - v0);
}
float alpha;
Uint32 col_crewred;
Uint32 col_crewyellow;
Uint32 col_crewgreen;
Uint32 col_crewcyan;
Uint32 col_crewblue;
Uint32 col_crewpurple; //actually pink
Uint32 col_crewinactive;
Uint32 col_clock;
Uint32 col_trinket;
int col_tr;
int col_tg;
int col_tb;
void updatetitlecolours();
bool kludgeswnlinewidth;
Uint32 crewcolourreal(int t);
2020-01-01 21:29:24 +01:00
};
#ifndef GRAPHICS_DEFINITION
Allow using help/graphics/music/game/key/map/obj everywhere This commit makes `help`, `graphics`, `music`, `game`, `key`, `map`, and `obj` essentially static global objects that can be used everywhere. This is useful in case we ever need to add a new function in the future, so we don't have to bother with passing a new argument in which means we have to pass a new argument in to the function that calls that function which means having to pass a new argument into the function that calls THAT function, etc. which is a real headache when working on fan mods of the source code. Note that this changes NONE of the existing function signatures, it merely just makes those variables accessible everywhere in the same way `script` and `ed` are. Also note that some classes had to be initialized after the filesystem was initialized, but C++ would keep initializing them before the filesystem got initialized, because I *had* to put them at the top of `main.cpp`, or else they wouldn't be global variables. The only way to work around this was to use entityclass's initialization style (which I'm pretty sure entityclass of all things doesn't need to be initialized this way), where you actually initialize the class in an `init()` function, and so then you do `graphics.init()` after the filesystem initialization, AFTER doing `Graphics graphics` up at the top. I've had to do this for `graphics` (but only because its child GraphicsResources `grphx` needs to be initialized this way), `music`, and `game`. I don't think this will affect anything. Other than that, `help`, `key`, and `map` are still using the C++-intended method of having ClassName::ClassName() functions.
2020-01-29 08:35:03 +01:00
extern Graphics graphics;
#endif
Allow using help/graphics/music/game/key/map/obj everywhere This commit makes `help`, `graphics`, `music`, `game`, `key`, `map`, and `obj` essentially static global objects that can be used everywhere. This is useful in case we ever need to add a new function in the future, so we don't have to bother with passing a new argument in which means we have to pass a new argument in to the function that calls that function which means having to pass a new argument into the function that calls THAT function, etc. which is a real headache when working on fan mods of the source code. Note that this changes NONE of the existing function signatures, it merely just makes those variables accessible everywhere in the same way `script` and `ed` are. Also note that some classes had to be initialized after the filesystem was initialized, but C++ would keep initializing them before the filesystem got initialized, because I *had* to put them at the top of `main.cpp`, or else they wouldn't be global variables. The only way to work around this was to use entityclass's initialization style (which I'm pretty sure entityclass of all things doesn't need to be initialized this way), where you actually initialize the class in an `init()` function, and so then you do `graphics.init()` after the filesystem initialization, AFTER doing `Graphics graphics` up at the top. I've had to do this for `graphics` (but only because its child GraphicsResources `grphx` needs to be initialized this way), `music`, and `game`. I don't think this will affect anything. Other than that, `help`, `key`, and `map` are still using the C++-intended method of having ClassName::ClassName() functions.
2020-01-29 08:35:03 +01:00
2020-01-01 21:29:24 +01:00
#endif /* GRAPHICS_H */