No more SDL_Renderer lets fucking gooo

This commit is contained in:
/nick haya 2022-02-16 08:47:39 +08:00
parent 98dee3e698
commit 9802d9d4da
22 changed files with 3774 additions and 896 deletions

View file

@ -10,15 +10,18 @@ set(OUT_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/SoLoud/")
set(OUT2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/SoLoud/MIDI/") set(OUT2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/SoLoud/MIDI/")
set(OUT3_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/toml/") set(OUT3_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/toml/")
set(OUT4_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/sdfml/") set(OUT4_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/sdfml/")
set(OUT5_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/src/SDL_gpu/")
option(PREFER_MODPLUG "Use libmodplug api instead of libopenmpt for module playback" ON)
# Support both 32 and 64 bit builds # Support both 32 and 64 bit builds
# Someone make a pull request to support MingW # Someone make a pull request to support MingW
# Way to lazy to do that right now # Way to lazy to do that right now
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8) if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_ttf.lib") set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_gpu.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2_ttf.lib")
set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x64/") set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x64/")
else () else ()
set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_ttf.lib") set(MAIN_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_gpu.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/libmodplug.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/soloud_static.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2_ttf.lib")
set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x86/") set(MAIN_LIBRARIES_E "${CMAKE_CURRENT_LIST_DIR}/lib/x86/")
endif () endif ()
@ -31,6 +34,7 @@ include_directories(${OUT_INCLUDE_DIRS})
include_directories(${OUT2_INCLUDE_DIRS}) include_directories(${OUT2_INCLUDE_DIRS})
include_directories(${OUT3_INCLUDE_DIRS}) include_directories(${OUT3_INCLUDE_DIRS})
include_directories(${OUT4_INCLUDE_DIRS}) include_directories(${OUT4_INCLUDE_DIRS})
include_directories(${OUT5_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_LIST_DIR}/src) include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
# add EVERY FUCKING source file to SOURCES # add EVERY FUCKING source file to SOURCES
@ -48,6 +52,7 @@ FILE(GLOB SOURCES "${CMAKE_CURRENT_LIST_DIR}/src/*.cpp"
"${CMAKE_CURRENT_LIST_DIR}/src/toml/*.hpp" "${CMAKE_CURRENT_LIST_DIR}/src/toml/*.hpp"
"${CMAKE_CURRENT_LIST_DIR}/src/sdfml/*.cpp" "${CMAKE_CURRENT_LIST_DIR}/src/sdfml/*.cpp"
"${CMAKE_CURRENT_LIST_DIR}/src/sdfml/*.hpp" "${CMAKE_CURRENT_LIST_DIR}/src/sdfml/*.hpp"
"${CMAKE_CURRENT_LIST_DIR}/src/SDL_gpu/*.h"
) )
# set c++ std to 17 # set c++ std to 17
@ -56,6 +61,9 @@ set(CMAKE_CXX_STANDARD 17)
# edit executable properties part 1 # edit executable properties part 1
add_executable(Skateboard WIN32 ${SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/resources/res.rc") add_executable(Skateboard WIN32 ${SOURCES} "${CMAKE_CURRENT_SOURCE_DIR}/resources/res.rc")
# COMPILE DEFINES
target_compile_definitions(Skateboard PRIVATE PREFER_MODPLUG)
# LINK EVERYTHING # LINK EVERYTHING
target_link_libraries(Skateboard ${MAIN_LIBRARIES}) target_link_libraries(Skateboard ${MAIN_LIBRARIES})
@ -80,6 +88,7 @@ file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2_ttf.lib") file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2_ttf.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2main.lib") file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2main.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2test.lib") file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2test.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/SDL2_gpu.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/soloud_static.lib") file(REMOVE_RECURSE "${BUILD_DIRECTORY}/soloud_static.lib")
file(REMOVE_RECURSE "${BUILD_DIRECTORY}/libmodplug.lib") file(REMOVE_RECURSE "${BUILD_DIRECTORY}/libmodplug.lib")

View file

@ -11,6 +11,7 @@ TinySoundfont and toml11 are under the MIT License.
This library is dual-licensed between DBAD and MIT license. This library is dual-licensed between DBAD and MIT license.
This means: This means:
- I do not care about what you do about this goddam library. - I do not care about what you do about this goddam library.
- You can sell it, butcher it, burn it, whatever. - You can sell it, butcher it, burn it, whatever.
- Just make sure to not be a dick :) - Just make sure to not be a dick :)

BIN
bin/data/music/canyon.ogg Normal file

Binary file not shown.

Binary file not shown.

View file

@ -33,8 +33,11 @@ class ExampleState : public sdfml::sdState {
example.AddAnimation("idle", {{0, 0, 50, 50}, {50, 0, 50, 50}}); example.AddAnimation("idle", {{0, 0, 50, 50}, {50, 0, 50, 50}});
example.PlayAnimation("idle"); example.PlayAnimation("idle");
example.framerate = 1; example.framerate = 1;
sdfml::sound.music.playMod("data/music/DOPE.it"); sdfml::sound.music.playMusic("data/music/canyon.ogg");
example.updateCamera(&camera); example.updateCamera(&camera);
bg1.create(0, 0, "data/images/bg.png");
add(&bg1);
bg1.updateCamera(&camera);
add(&example); add(&example);
} }
virtual void update(float elapsed) { virtual void update(float elapsed) {
@ -47,6 +50,10 @@ class ExampleState : public sdfml::sdState {
if (sdfml::key_pressed(SDL_SCANCODE_DOWN)) if (sdfml::key_pressed(SDL_SCANCODE_DOWN))
example.y += 1; example.y += 1;
bg1.scale.x = sin(sdfml::elapsed/100);
bg1.scale.y = cos(sdfml::elapsed/100);
bg1.screenCenter();
sdfml::focusCamera(&camera, example); sdfml::focusCamera(&camera, example);
} }
}; };

View file

@ -1,462 +0,0 @@
#include <fstream>
#include <functional>
#include <iostream>
#include <iterator>
#include <map>
#include <sstream>
#include <stdio.h>
#include <time.h>
#include <vector>
#include <string>
#include "SDL2/SDL.h"
#include "SDL2/SDL_ttf.h"
#include "Render.hpp"
#include "SDL2/SDL_syswm.h"
#include "SoLoud/soloud.h"
#include "SoLoud/soloud_wav.h"
#include "SoLoud/soloud_openmpt.h"
#include <iomanip>
#include "SDL2/SDL_stbimage.h"
#include <ctime>
#include <winuser.h>
#include "toml.hpp"
#include <fstream>
using namespace std;
using namespace Render;
string SOUNDFONT = "data/gm.sf2";
SDL_Window* Render::window;
SDL_Renderer* Render::renderer;
SDL_Event Render::event;
State* Render::current_state = nullptr;
SoLoud::Soloud Render::music;
SoLoud::Soloud Render::se;
SoLoud::WavStream Render::waveLoader;
SoLoud::Openmpt Render::modLoader;
SoLoud::Modplug Render::modPlugLoader;
SoLoud::Midi Render::midiLoader;
SoLoud::SoundFont Render::current_sf;
string Render::currentMusic = "";
HWND Render::hwnd;
HWND Render::consoleD;
int Render::seIndex;
SoLoud::Speech Render::SPEAK_BITCH;
SoLoud::FFTFilter Render::bass;
Render::Object::Object() {
}
Render::Object::~Object() {
// placeholder
}
Render::State::State() {
// placeholder
}
Render::State::~State() {
// placeholder
}
void Render::Object::create(int x, int y, string path){
this->_tex = STBIMG_LoadTexture(renderer, path.c_str());
SDL_SetTextureBlendMode(_tex, SDL_BLENDMODE_BLEND);
if (_tex == nullptr) {
cout << "texture failed to lod" << endl;
}
_x = x;
_y = y;
_sc_x = x;
_sc_y = y;
int w_, h_;
SDL_QueryTexture(this->_tex, NULL, NULL, &w_, &h_);
_sc_w = w_;
_sc_h = h_;
this->x = x;
this->y = y;
w = w_;
h = h_;
_ori_w = w_;
_ori_h = h_;
}
void Render::AnimatedObject::create(int x, int y, string path){
Render::Object::create(x,y,path);
startTime = SDL_GetTicks();
}
void Render::State::AddObject(Render::Object* object) {
object->id = obj.size();
this->obj.push_back(object);
}
vector<Object*> Render::State::get_obj() {
return this->obj;
}
void Render::Object::Draw(float dt) {
_x = x;
_sc_x = x-cam_rect->x;
_y = y;
_sc_y = y-cam_rect->y;
_w = w*scale.x;
_sc_w = _w;
_h = h*scale.y;
_sc_h = _h;
if (alpha > 100)
alpha = 100;
if (alpha < 0)
alpha = 0;
SDL_SetTextureAlphaMod(this->_tex, (this->alpha/100)*255);
}
void Render::Object::setCamera(SDL_Rect* cam_p) {
cam_rect = cam_p;
}
void Render::AnimatedObject::Draw(float dt) {
Render::Object::Draw(dt);
if (current_framename != "") {
// this will make it so that current_frame will only advance when it needs to
int frameToDraw = ((SDL_GetTicks() - startTime) * framerate / 1000) % frameRects[current_framename].size();
current_frame = frameToDraw;
int sx = frameRects[current_framename][current_frame].x;
int sy = frameRects[current_framename][current_frame].y;
int sw = frameRects[current_framename][current_frame].w;
int sh = frameRects[current_framename][current_frame].h;
// support scaling :)
_sc_w = frameRects[current_framename][current_frame].w*scale.x;
_sc_h = frameRects[current_framename][current_frame].h*scale.y;
// after setting shit up, we then store it in src_rect.
src_rect = {sx, sy, sw, sh};
}
}
void Render::AnimatedObject::AddAnimation(string anim_name, vector<SDL_Rect> points) {
frameRects.insert({anim_name, points});
}
void Render::AnimatedObject::PlayAnimation(string anim_name) {
current_framename = anim_name;
}
void Render::TextObject::create(int x, int y, string text, string font_name, SDL_Color color, int style, int size) {
Render::Object::create(x,y,"data/smile.png"); // dummy
this->text = text;
_tex = nullptr;
_sc_x = x;
_sc_y = y;
_sc_w = strlen(text.c_str())*size;
_sc_h = strlen(text.c_str())*size;
this->x = x;
this->y = y;
w = strlen(text.c_str())*size;
h = strlen(text.c_str())*size;
font_size = size;
this->color = color;
font = FC_CreateFont();
FC_LoadFont(font, renderer, font_name.c_str(), size, color, style);
}
void Render::TextObject::Draw(float dt) {
Render::Object::Draw(dt);
FC_Effect eff;
eff.alignment = alignment;
eff.color = color;
eff.scale.x = scale.x;
eff.scale.y = scale.y;
FC_SetFilterMode(font, (antialiasing ? FC_FILTER_LINEAR : FC_FILTER_NEAREST));
FC_DrawEffect(font, renderer, x-offset.x, y-offset.y, eff, text.c_str());
SDL_Rect rec = FC_GetBounds(font, x-offset.x, y-offset.y, alignment, eff.scale, text.c_str());
w = rec.w;
h = rec.h;
}
void Render::Object::centerSelf(AXIS axis) {
switch (axis) {
case X:
x = (WINDOW_WIDTH/2) - (w*scale.x/2);
break;
case Y:
y = (WINDOW_HEIGHT/2) - (h*scale.y/2);
break;
case XY:
x = (WINDOW_WIDTH/2) - (w*scale.x/2);
y = (WINDOW_HEIGHT/2) - (h*scale.y/2);
break;
}
}
bool Render::Init(string window_name) {
std::ofstream logFile;
logFile.open("log.txt", std::ofstream::out | std::ofstream::trunc);
logFile.close();
if (!touchFile("conf.toml"))
{
tomlExport("conf.toml",
{
{"config", {{"soundfont", "data/gm.sf2"}}}
});
}
SOUNDFONT = tomlParse<string>("conf.toml", "config", "soundfont");
if (music.init() > 0) {
log("SoLoud", " has failed to load. Is your dll broken?", ERROR_, __FILENAME__, __LINE__);
return false;
}
log("SoLoud", " has been successfully initialized.", NORMAL, __FILENAME__, __LINE__);
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
log("SDL", " has failed to load. Is your dll broken? " + string(SDL_GetError()), ERROR_, __FILENAME__, __LINE__);
return false;
}
log("SDL", " has been successfully initialized.", NORMAL, __FILENAME__, __LINE__);
if (TTF_Init() < 0) {
log("SDL_ttf", " has failed to load. Is your dll broken? " + string(SDL_GetError()), ERROR_, __FILENAME__, __LINE__);
return false;
}
log("SDL_ttf", " has been successfully initialized.", NORMAL, __FILENAME__, __LINE__);
window = SDL_CreateWindow(window_name.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
if (window == nullptr) {
log("A window", " failed to be created. " + string(SDL_GetError()), ERROR_, __FILENAME__, __LINE__);
return false;
}
log("A window", " has been created.", NORMAL, __FILENAME__, __LINE__);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == nullptr) {
log("A renderer", " failed to be created. " + string(SDL_GetError()), ERROR_, __FILENAME__, __LINE__);
return false;
}
log("A renderer", " has been created.", NORMAL, __FILENAME__, __LINE__);
current_sf.load(SOUNDFONT.c_str());
SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);
SDL_GetWindowWMInfo(window, &wmInfo);
hwnd = wmInfo.info.win.window;
log("", "Finalized initialization. Command over.", NORMAL, __FILENAME__, __LINE__);
AddExitButton();
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
return true;
}
vector<float> Render::_sec;
vector<Func<int>> Render::_call;
vector<bool> Render::_repeats;
vector<int> Render::_ticks;
template <typename T>
void remove_a(std::vector<T>& vec, size_t pos)
{
typename std::vector<T>::iterator it = vec.begin();
std::advance(it, pos);
vec.erase(it);
}
bool Render::Update() {
int lastUpdate = SDL_GetTicks();
bool run = true;
while (run) {
while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT) {
run = false;
break;
}
else if (event.type == SDL_SYSWMEVENT) {
if (event.syswm.msg->msg.win.msg == WM_COMMAND)
{
if (LOWORD(event.syswm.msg->msg.win.wParam) == 1)
{
run = false;
break;
}
}
}
}
int start = SDL_GetPerformanceCounter();
int current = SDL_GetTicks();
float dT = (current - lastUpdate) / 1000.0f;
current_state->Update(dT);
// I know this is a shitty way to do this
// but bear with me
// it was hard to work with lambdas properly man
// let me have this just one please :)
if (_sec.size() > 0) {
for (int i = 0; i < _sec.size(); i++) {
if (_ticks[i] != -1)
_ticks[i]++;
if (_sec[i] != -1) {
if (!(_ticks[i] < Sec2Tick(_sec[i]))) {
if (_call[i] != NULL)
_call[i](NULL);
if (!_repeats[i] && _repeats[i] != NULL)
{
_ticks[i] = -1;
_sec[i] = -1;
_call[i] = NULL;
_repeats[i] = NULL;
}
}
}
// cout << i << endl;
}
}
lastUpdate = current;
current_state->Draw(dT);
int end = SDL_GetPerformanceCounter();
float elapsedMS = (end - start) / SDL_GetPerformanceFrequency() * 1000.0f;
SDL_Delay(floor((1000.0f/FRAMERATE) - elapsedMS));
}
for (int i = 0; i < current_state->get_obj().size(); i++) {
SDL_DestroyTexture(current_state->get_obj()[i]->_tex);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
music.stopAll();
music.deinit();
TTF_Quit();
SDL_Quit();
ReleaseConsole();
return false;
}
void Render::SwitchState(State* state) {
string state_name = typeid(*state).name();
log("", "Switching current state to " + state_name, NORMAL, __FILENAME__, __LINE__);
if (current_state != nullptr) {
_ticks = {};
_call = {};
_repeats = {};
_sec = {};
for (int i = 0; i < current_state->get_obj().size(); i++) {
SDL_DestroyTexture(current_state->get_obj()[i]->_tex);
}
}
current_state = state;
log("Success!", " Calling Create()....", NORMAL, __FILENAME__, __LINE__);
current_state->Create();
}
bool Render::playSound(string path, bool override) {
log("", "Played sound from " + path, NORMAL, __FILENAME__, __LINE__);
waveLoader.setLooping(false);
if (override) {
music.stop(seIndex);
}
waveLoader.load(path.c_str());
seIndex = music.play(waveLoader);
return true;
}
bool Render::playMusic(string path) {
if (path == "") {
log("", "Silence." + path, NORMAL, __FILENAME__, __LINE__);
music.stopAll();
return true;
}
log("", "Played music from " + path, NORMAL, __FILENAME__, __LINE__);
if (currentMusic == path) {
music.stopAll();
}
waveLoader.load(path.c_str());
waveLoader.setLooping(true);
music.play(waveLoader);
currentMusic = path;
return true;
}
bool Render::playModPlug(string path) {
if (path == "") {
log("", "Silence." + path, NORMAL, __FILENAME__, __LINE__);
music.stopAll();
return true;
}
if (currentMusic == path) {
music.stopAll();
}
// midis
if (path.find(".mid") != string::npos) {
log("", "Played midi from " + path + " with soundfont " + SOUNDFONT, NORMAL, __FILENAME__, __LINE__);
midiLoader.load(path.c_str(), current_sf);
midiLoader.setLooping(true);
music.play(midiLoader);
currentMusic = path;
return true;
}
log("", "Try to play " + path + " using libopenmpt", NORMAL, __FILENAME__, __LINE__);
if (modLoader.load(path.c_str()) != SoLoud::SO_NO_ERROR) {
log("", "Playing " + path + " using libmodplug", NORMAL, __FILENAME__, __LINE__);
if (modPlugLoader.load(path.c_str()) != SoLoud::SO_NO_ERROR) {
log("", "Could not play " + path, NORMAL, __FILENAME__, __LINE__);
return false;
}
modPlugLoader.setLooping(true);
music.play(modPlugLoader);
currentMusic = path;
return true;
}
modLoader.setLooping(true);
music.play(modLoader);
currentMusic = path;
return true;
}
void Render::pointTo(SDL_Rect* camera, Object object) {
camera->x = ( object.x + (object.w / 2) ) - WINDOW_WIDTH / 2;
camera->y = ( object.y + (object.h / 2) ) - WINDOW_HEIGHT / 2;
if( camera->x < 0 )
{
camera->x = 0;
}
if( camera->y < 0 )
{
camera->y = 0;
}
if( camera->x > camera->w )
{
camera->x = camera->w;
}
if( camera->y > camera->h )
{
camera->y = camera->h;
}
}

View file

@ -1,392 +0,0 @@
#ifndef _RENDER_H
#define _RENDER_H
#include <array>
#include <functional>
#include <iostream>
#include <map>
#include <stdint.h>
#include <system_error>
#include <vector>
#include <string>
#include <windows.h>
#include "SDL2/SDL.h"
#include "SDL2/SDL_ttf.h"
#include "SDL2/SDL_FontCache.h"
#include "SoLoud/soloud.h"
#include "SoLoud/soloud_wav.h"
#include "SoLoud/soloud_wavstream.h"
#include "SoLoud/soloud_modplug.h"
#include "SoLoud/soloud_openmpt.h"
#include "SoLoud/MIDI/soloud_midi.h"
#include "SoLoud/soloud_speech.h"
#include "SoLoud/soloud_vizsn.h"
#include "SoLoud/soloud_waveshaperfilter.h"
#include "SoLoud/soloud_biquadresonantfilter.h"
#include "SoLoud/soloud_fftfilter.h"
#include "SDL2/SDL_stbimage.h"
#include "toml.hpp"
#include <fstream>
#include "guicon.h"
#ifdef _WIN32 || WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#else
#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#endif
using namespace std;
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
#define FRAMERATE 60
#define MAX_SE 10
extern string SOUNDFONT;
struct Vector2
{
float x = 1;
float y = 1;
};
struct Vector2i
{
int x = 1;
int y = 1;
};
enum AXIS {
X,
Y,
XY
};
enum CLOSE_CODES {
NO_ERROR_CODE,
ERROR_CODE,
UNKNOWN
};
enum LOG_TYPE {
NORMAL,
WARNING,
ERROR_
};
namespace Render {
extern SDL_Window* window;
extern SDL_Renderer* renderer;
/*
* The object class is a class that contains functionality to make it do... stuff.
*/
class Object {
public:
Object();
~Object();
int id = NULL;
/*
* Create a new Object instance.
*/
virtual void create(int x = 0, int y = 0, string path = "");
virtual void Draw(float dt);
int x, y, w, h;
Vector2i offset = {0, 0};
Vector2 scale;
float angle = 0.00001;
float alpha = 100;
SDL_Point center = {0, 0};
map<string, bool> get_properties() const;
int _sc_x, _sc_y, _sc_w, _sc_h;
SDL_Texture* _tex = nullptr;
void set_property(string name, bool value);
SDL_Rect get_src() {return src_rect;};
SDL_Rect src_rect = {0, 0, 0, 0};
/*
* Center object on the center of the screen on a certain axis. Defaults to both X and Y.
*/
void centerSelf(AXIS axis = XY);
void setCamera(SDL_Rect* cam_p);
private:
int _x, _y, _w, _h;
int _ori_w, _ori_h;
SDL_Rect du = {0, 0, 0, 0};
SDL_Rect* cam_rect = &du;
map<string, bool> _properties;
};
class AnimatedObject : public Object {
public:
/*
* Create a new AnimatedObject instance.
*/
virtual void create(int x = 0, int y = 0, string path = "");
/*
* Add an animation to said object. Uses SDL_Rects for frames.
*/
void AddAnimation(string anim_name, vector<SDL_Rect> points);
/*
* Play an animation.
*/
void PlayAnimation(string anim_name);
virtual void Draw(float dt);
int framerate = 24;
map<string, vector<SDL_Rect>> frameRects;
string current_framename = "";
int current_frame = 0;
private:
int startTime;
};
class TextObject : public Object {
public:
/*
* Create a new TextObject instance.
*/
virtual void create(int x = 0, int y = 0, string text = "", string font_name = "data/monogram.ttf", SDL_Color color = {255, 255, 255, 255}, int style = TTF_STYLE_NORMAL, int size = 20);
virtual void Draw(float dt);
FC_Font* font;
FC_AlignEnum alignment = FC_ALIGN_LEFT;
SDL_Color color;
string text = "";
bool antialiasing = false;
private:
int font_size = 20;
};
template <typename T>
using Func = std::function<T(T)>;
extern vector<float> _sec;
extern vector<Func<int>> _call;
extern vector<bool> _repeats;
extern vector<int> _ticks;
class Timer {
public:
void start(float seconds, Func<int> callback, bool repeat = false) {
_sec.push_back(seconds);
_call.push_back(callback);
_repeats.push_back(repeat);
_ticks.push_back(0);
}
};
/*
* A state is where you would contain said objects.
*/
class State {
public:
State();
~State();
/*
* State entrypoint.
*/
virtual void Create() {
}
/*
* State update point.
*/
virtual void Update(float dt) {}
/*
* State draw point. Make sure to call State::Draw() first when overriding this!!!
*/
virtual void Draw(float dt){
SDL_RenderClear(renderer);
if (obj.size() > 0)
for (int i = 0; i < obj.size(); i++) {
obj[i]->Draw(dt);
if (obj[i]->_tex != nullptr) {
SDL_Rect r = {obj[i]->_sc_x+obj[i]->offset.x, obj[i]->_sc_y+obj[i]->offset.y, obj[i]->_sc_w, obj[i]->_sc_h};
SDL_Rect r2 = obj[i]->src_rect;
if (r2.w != 0 && r2.h != 0)
SDL_RenderCopyEx(renderer, obj[i]->_tex, &r2, &r, obj[i]->angle, &obj[i]->center, SDL_FLIP_NONE);
else
SDL_RenderCopyEx(renderer, obj[i]->_tex, NULL, &r, obj[i]->angle, &obj[i]->center, SDL_FLIP_NONE);
}
}
SDL_RenderPresent(renderer);
}
/*
* Use this to add objects. Make sure to pass the address, not the object itself.
*/
virtual void AddObject(Object* object);
vector<Object*> get_obj();
private:
vector<Object*> obj;
};
/*
* Init EVERYTHING. Also makes sure everything works.
*/
bool Init(string window_name);
/*
* Internal main update loop. Only call once.
*/
bool Update();
/*
* Switch our current state. Pass the address of the state, not the state itself.
*/
void SwitchState(State* state);
extern SDL_Event event;
extern HWND hwnd;
extern HWND consoleD;
extern State* current_state;
extern SoLoud::Soloud se;
extern SoLoud::Soloud music;
extern SoLoud::WavStream waveLoader;
extern SoLoud::Openmpt modLoader;
extern SoLoud::Modplug modPlugLoader;
extern SoLoud::Midi midiLoader;
extern SoLoud::SoundFont current_sf;
extern string currentMusic;
extern int seIndex;
/*
* Play a sound. Will not override unless said so.
*/
bool playSound(string path, bool override = false);
/*
* Play music. Always loops.
* Passing a blank string (e.g. "") will stop the current playing music.
*/
bool playMusic(string path);
/*
* Play music thru the openMPT api (669, amf, ams, dbm, digi, dmf, dsm, far, gdm, ice, imf, it, itp, j2b, m15, mdl, med, mo3, mod, mptm, mt2, mtm, okt, plm, psm, ptm, s3m, stm, ult, umx, wow, xm). Always loops.
* When a midi is passed (mid), it will use a TSF-based midi loader instead.
* If libopenmpt fails to load, it will resort to the libmodplug api instead.
* Passing a blank string (e.g. "") will stop the current playing music.
*/
bool playModPlug(string path);
/*
* Make the camera center itself on an object.
*/
void pointTo(SDL_Rect* camera, Object object);
inline void log(string prefix, string msg, LOG_TYPE type = NORMAL, string file = "???.cpp", int line = 0) {
clock_t now = std::clock();
double now_n = (double)now / CLOCKS_PER_SEC;
string typeName = "LOG";
switch (type) {
case NORMAL:
break;
case WARNING:
typeName = "WARNING";
break;
case ERROR_:
typeName = "ERROR";
break;
}
std::stringstream buf;
buf << (int)(now_n/60) << ":"
<< std::setfill('0') << std::setw(2) << (int)((int)now_n % 60) << "."
<< std::setfill('0') << std::setw(3) << (int)((now_n - (int)now_n) * 1000) << " "
<< typeName << ": (" << file << ":" << line << ") " << prefix << msg << endl;
std::ofstream logFile;
logFile.open("log.txt", std::ios::app);
logFile << buf.str();
logFile.close();
cout << buf.str();
}
inline int Sec2Tick(float time) {
return FRAMERATE*time;
}
// Parse a TOML at a given path with a table and key.
// Setting table name to "" will look for the key without a table.
template <typename T>
T tomlParse(string path, string table_name = "", string key = "") {
auto parsed = toml::parse(path);
if (table_name != "") {
auto& config_table = toml::find(parsed, table_name);
return toml::find<T>(config_table, key);
}
return toml::find<T>(parsed, key);
}
// "touch" a file at a given path.
// Returns false if file is empty, returns true if not
inline bool touchFile(string path) {
std::ofstream file;
file.open(path, std::ios::app);
file.close();
fstream oFile(path);
oFile.seekg(0,std::ios::end);
unsigned int size = oFile.tellg();
if (!size) {
oFile.close();
return false;
}
oFile.close();
return true;
}
// Export a TOML file to a path from a toml::value.
inline void tomlExport(string path, toml::value values) {
string export_ = toml::format(values, 0, 2);
std::ofstream config;
config.open(path, std::ofstream::out | std::ofstream::trunc);
config << export_ << endl;
config.close();
}
// SPEAK you fucking BITCH
extern SoLoud::Speech SPEAK_BITCH;
extern SoLoud::FFTFilter bass;
static HMENU exitButton;
// makes A BITCH SPEAK out shit
inline void SPEAK(string words, unsigned int aBaseFrequency = 3000.0f, float aBaseSpeed = 10.0f, float aBaseDeclination = 0.5f, int aBaseWaveform = KW_SQUARE) {
SPEAK_BITCH.setFilter(1, &bass);
SPEAK_BITCH.setParams(aBaseFrequency, aBaseSpeed, aBaseDeclination, aBaseWaveform);
SPEAK_BITCH.setVolume(5.0);
SPEAK_BITCH.setText(words.c_str());
seIndex = se.play(SPEAK_BITCH);
}
inline void AddExitButton() {
exitButton = CreateMenu();
AppendMenu(exitButton, MF_STRING, 1, "Exit");
SetMenu(hwnd, exitButton);
}
}
#endif

View file

@ -36,8 +36,10 @@ THE SOFTWARE.
#include "SDL.h" #include "SDL.h"
#include "SDL_ttf.h" #include "SDL_ttf.h"
#define FC_USE_SDL_GPU
#ifdef FC_USE_SDL_GPU #ifdef FC_USE_SDL_GPU
#include "SDL_gpu.h" #include "../SDL_gpu/SDL_gpu.h"
#endif #endif
@ -51,8 +53,6 @@ extern "C" {
// Let's pretend this exists... // Let's pretend this exists...
#define TTF_STYLE_OUTLINE 16 #define TTF_STYLE_OUTLINE 16
// Differences between SDL_Renderer and SDL_gpu // Differences between SDL_Renderer and SDL_gpu
#ifdef FC_USE_SDL_GPU #ifdef FC_USE_SDL_GPU
#define FC_Rect GPU_Rect #define FC_Rect GPU_Rect

2071
src/SDL_gpu/SDL_gpu.h Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,100 @@
#ifndef _SDL_GPU_GLES_1_H__
#define _SDL_GPU_GLES_1_H__
#include "SDL_gpu.h"
#include "SDL_platform.h"
#if !defined(SDL_GPU_DISABLE_GLES) && !defined(SDL_GPU_DISABLE_GLES_1)
#ifdef __IPHONEOS__
#include <OpenGLES/ES1/gl.h>
#include <OpenGLES/ES1/glext.h>
#else
#include "GLES/gl.h"
#include "GLES/glext.h"
#endif
#define glFrustum glFrustumf
#define glOrtho glOrthof
#define glGenerateMipmap glGenerateMipmapOES
#define glDeleteFramebuffers glDeleteFramebuffersOES
#define glGenFramebuffers glGenFramebuffersOES
#define glFramebufferTexture2D glFramebufferTexture2DOES
#define glCheckFramebufferStatus glCheckFramebufferStatusOES
#define glBindFramebuffer glBindFramebufferOES
#define GL_FRAMEBUFFER GL_FRAMEBUFFER_OES
#define GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_OES
#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_OES
#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES
/* It looks like on Raspberry Pi 2/Raspbian, the
symbols in library are missing the OES suffix,
even though the headers seem to be named right.
*/
#ifdef ADD_MISSING_OES_FUNCTIONS
extern void glBlendEquation(GLenum mode);
extern void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
extern void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
#else
#define glBlendEquation glBlendEquationOES
#define glBlendEquationSeparate glBlendEquationSeparateOES
#define glBlendFuncSeparate glBlendFuncSeparateOES
#endif
#define GL_FUNC_ADD GL_FUNC_ADD_OES
#define GL_FUNC_SUBTRACT GL_FUNC_SUBTRACT_OES
#define GL_FUNC_REVERSE_SUBTRACT GL_FUNC_REVERSE_SUBTRACT_OES
#define GL_MIRRORED_REPEAT GL_MIRRORED_REPEAT_OES
#endif
#define GPU_CONTEXT_DATA ContextData_GLES_1
#define GPU_IMAGE_DATA ImageData_GLES_1
#define GPU_TARGET_DATA TargetData_GLES_1
typedef struct ContextData_GLES_1
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices and 4 tex coords interleaved (e.g. [x0, y0, z0, s0, t0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
} ContextData_GLES_1;
typedef struct ImageData_GLES_1
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_GLES_1;
typedef struct TargetData_GLES_1
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_GLES_1;
#endif

View file

@ -0,0 +1,163 @@
#ifndef _SDL_GPU_GLES_2_H__
#define _SDL_GPU_GLES_2_H__
#include "SDL_gpu.h"
#include "SDL_platform.h"
#if !defined(SDL_GPU_DISABLE_GLES) && !defined(SDL_GPU_DISABLE_GLES_2)
#ifdef __IPHONEOS__
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
#else
#include "GLES2/gl2.h"
#include "GLES2/gl2ext.h"
#endif
#define glVertexAttribI1i glVertexAttrib1f
#define glVertexAttribI2i glVertexAttrib2f
#define glVertexAttribI3i glVertexAttrib3f
#define glVertexAttribI4i glVertexAttrib4f
#define glVertexAttribI1ui glVertexAttrib1f
#define glVertexAttribI2ui glVertexAttrib2f
#define glVertexAttribI3ui glVertexAttrib3f
#define glVertexAttribI4ui glVertexAttrib4f
#define glMapBuffer glMapBufferOES
#define glUnmapBuffer glUnmapBufferOES
#define GL_WRITE_ONLY GL_WRITE_ONLY_OES
#endif
#define GPU_CONTEXT_DATA ContextData_GLES_2
#define GPU_IMAGE_DATA ImageData_GLES_2
#define GPU_TARGET_DATA TargetData_GLES_2
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 100\n\
precision highp float;\n\
precision mediump int;\n\
\
attribute vec2 gpu_Vertex;\n\
attribute vec2 gpu_TexCoord;\n\
attribute mediump vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying mediump vec4 color;\n\
varying vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
// Tier 3 uses shader attributes to send position, texcoord, and color data for each vertex.
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 100\n\
precision highp float;\n\
precision mediump int;\n\
\
attribute vec2 gpu_Vertex;\n\
attribute mediump vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying mediump vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 100\n\
#ifdef GL_FRAGMENT_PRECISION_HIGH\n\
precision highp float;\n\
#else\n\
precision mediump float;\n\
#endif\n\
precision mediump int;\n\
\
varying mediump vec4 color;\n\
varying vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
void main(void)\n\
{\n\
gl_FragColor = texture2D(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 100\n\
#ifdef GL_FRAGMENT_PRECISION_HIGH\n\
precision highp float;\n\
#else\n\
precision mediump float;\n\
#endif\n\
precision mediump int;\n\
\
varying mediump vec4 color;\n\
\
void main(void)\n\
{\n\
gl_FragColor = color;\n\
}"
typedef struct ContextData_GLES_2
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices, each with interleaved position, tex coords, and colors (e.g. [x0, y0, z0, s0, t0, r0, g0, b0, a0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
// Tier 3 rendering
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_GLES_2;
typedef struct ImageData_GLES_2
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_GLES_2;
typedef struct TargetData_GLES_2
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_GLES_2;
#endif

View file

@ -0,0 +1,168 @@
#ifndef _SDL_GPU_GLES_3_H__
#define _SDL_GPU_GLES_3_H__
#include "SDL_gpu.h"
#include "SDL_platform.h"
#if !defined(SDL_GPU_DISABLE_GLES) && !defined(SDL_GPU_DISABLE_GLES_3)
#ifdef __IPHONEOS__
#include <OpenGLES/ES3/gl.h>
#include <OpenGLES/ES3/glext.h>
#elif defined(SDL_GPU_DYNAMIC_GLES_3)
#include "gl3stub.h"
#else
#include "GLES3/gl3.h"
#include "GLES2/gl2ext.h"
#endif
#define glVertexAttribI1i glVertexAttrib1f
#define glVertexAttribI2i glVertexAttrib2f
#define glVertexAttribI3i glVertexAttrib3f
#define glVertexAttribI1ui glVertexAttrib1f
#define glVertexAttribI2ui glVertexAttrib2f
#define glVertexAttribI3ui glVertexAttrib3f
#define glMapBuffer glMapBufferOES
#define glUnmapBuffer glUnmapBufferOES
#define GL_WRITE_ONLY GL_WRITE_ONLY_OES
#endif
#define GPU_CONTEXT_DATA ContextData_GLES_3
#define GPU_IMAGE_DATA ImageData_GLES_3
#define GPU_TARGET_DATA TargetData_GLES_3
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 300 es\n\
precision highp float;\n\
precision mediump int;\n\
\
in vec2 gpu_Vertex;\n\
in vec2 gpu_TexCoord;\n\
in mediump vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out mediump vec4 color;\n\
out vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
// Tier 3 uses shader attributes to send position, texcoord, and color data for each vertex.
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 300 es\n\
precision highp float;\n\
precision mediump int;\n\
\
in vec2 gpu_Vertex;\n\
in mediump vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out mediump vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 300 es\n\
#ifdef GL_FRAGMENT_PRECISION_HIGH\n\
precision highp float;\n\
#else\n\
precision mediump float;\n\
#endif\n\
precision mediump int;\n\
\
in mediump vec4 color;\n\
in vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = texture(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 300 es\n\
#ifdef GL_FRAGMENT_PRECISION_HIGH\n\
precision highp float;\n\
#else\n\
precision mediump float;\n\
#endif\n\
precision mediump int;\n\
\
in mediump vec4 color;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = color;\n\
}"
typedef struct ContextData_GLES_3
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices, each with interleaved position, tex coords, and colors (e.g. [x0, y0, z0, s0, t0, r0, g0, b0, a0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
// Tier 3 rendering
unsigned int blit_VAO;
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_GLES_3;
typedef struct ImageData_GLES_3
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_GLES_3;
typedef struct TargetData_GLES_3
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_GLES_3;
#endif

View file

@ -0,0 +1,273 @@
#ifndef _SDL_GPU_OPENGL_1_H__
#define _SDL_GPU_OPENGL_1_H__
#include "SDL_gpu.h"
#if !defined(SDL_GPU_DISABLE_OPENGL) && !defined(SDL_GPU_DISABLE_OPENGL_1)
// Hacks to fix compile errors due to polluted namespace
#ifdef _WIN32
#define _WINUSER_H
#define _WINGDI_H
#endif
#include "glew.h"
#if defined(GL_EXT_bgr) && !defined(GL_BGR)
#define GL_BGR GL_BGR_EXT
#endif
#if defined(GL_EXT_bgra) && !defined(GL_BGRA)
#define GL_BGRA GL_BGRA_EXT
#endif
#if defined(GL_EXT_abgr) && !defined(GL_ABGR)
#define GL_ABGR GL_ABGR_EXT
#endif
#undef glBlendFuncSeparate
#define glBlendFuncSeparate glBlendFuncSeparateEXT
#undef glBlendEquation
#define glBlendEquation glBlendEquationEXT
#undef glBlendEquationSeparate
#define glBlendEquationSeparate glBlendEquationSeparateEXT
#undef GL_MIRRORED_REPEAT
#define GL_MIRRORED_REPEAT GL_MIRRORED_REPEAT_ARB
#undef glCreateShader
#undef GL_VERTEX_SHADER
#undef GL_FRAGMENT_SHADER
#undef glShaderSource
#undef glCompileShader
#undef glGetShaderiv
#undef GL_COMPILE_STATUS
#undef glGetShaderInfoLog
#undef glDeleteShader
#undef glActiveTexture
#undef GL_TEXTURE0
#define glCreateShader glCreateShaderObjectARB
#define GL_VERTEX_SHADER GL_VERTEX_SHADER_ARB
#define GL_FRAGMENT_SHADER GL_FRAGMENT_SHADER_ARB
#define glShaderSource glShaderSourceARB
#define glCompileShader glCompileShaderARB
#define glGetShaderiv glGetObjectParameterivARB
#define GL_COMPILE_STATUS GL_OBJECT_COMPILE_STATUS_ARB
#define glGetShaderInfoLog glGetInfoLogARB
#define glDeleteShader glDeleteObjectARB
#define glActiveTexture glActiveTextureARB
#define GL_TEXTURE0 GL_TEXTURE0_ARB
#undef glCreateProgram
#undef glAttachShader
#undef glLinkProgram
#undef GL_LINK_STATUS
#undef glGetProgramiv
#undef glGetProgramInfoLog
#undef glUseProgram
#undef glDeleteProgram
#define glCreateProgram glCreateProgramObjectARB
#define glAttachShader glAttachObjectARB
#define glLinkProgram glLinkProgramARB
#define GL_LINK_STATUS GL_OBJECT_LINK_STATUS_ARB
#define glGetProgramiv glGetObjectParameterivARB
#define glGetProgramInfoLog glGetInfoLogARB
#define glUseProgram glUseProgramObjectARB
#define glDeleteProgram glDeleteObjectARB
#undef glGetUniformLocation
#undef glGetUniformiv
#undef glUniform1i
#undef glUniform1iv
#undef glUniform2iv
#undef glUniform3iv
#undef glUniform4iv
#undef glUniform1f
#undef glUniform1fv
#undef glUniform2fv
#undef glUniform3fv
#undef glUniform4fv
#undef glUniformMatrix4fv
#define glGetUniformLocation glGetUniformLocationARB
#define glGetUniformiv glGetUniformivARB
#define glUniform1i glUniform1iARB
#define glUniform1iv glUniform1ivARB
#define glUniform2iv glUniform2ivARB
#define glUniform3iv glUniform3ivARB
#define glUniform4iv glUniform4ivARB
#define glUniform1f glUniform1fARB
#define glUniform1fv glUniform1fvARB
#define glUniform2fv glUniform2fvARB
#define glUniform3fv glUniform3fvARB
#define glUniform4fv glUniform4fvARB
#define glUniformMatrix4fv glUniformMatrix4fvARB
#undef glGetAttribLocation
#undef glVertexAttrib1f
#undef glVertexAttrib2f
#undef glVertexAttrib3f
#undef glVertexAttrib4f
#undef glVertexAttribI1i
#undef glVertexAttribI2i
#undef glVertexAttribI3i
#undef glVertexAttribI4i
#undef glVertexAttribI1ui
#undef glVertexAttribI2ui
#undef glVertexAttribI3ui
#undef glVertexAttribI4ui
#define glGetAttribLocation glGetAttribLocationARB
#define glVertexAttrib1f glVertexAttrib1fARB
#define glVertexAttrib2f glVertexAttrib2fARB
#define glVertexAttrib3f glVertexAttrib3fARB
#define glVertexAttrib4f glVertexAttrib4fARB
#define glVertexAttribI1i glVertexAttrib1sARB
#define glVertexAttribI2i glVertexAttrib2sARB
#define glVertexAttribI3i glVertexAttrib3sARB
#define glVertexAttribI4i glVertexAttrib4sARB
#define glVertexAttribI1ui glVertexAttrib1sARB
#define glVertexAttribI2ui glVertexAttrib2sARB
#define glVertexAttribI3ui glVertexAttrib3sARB
#define glVertexAttribI4ui glVertexAttrib4sARB
#undef glGenBuffers
#undef glDeleteBuffers
#undef glBindBuffer
#undef glBufferData
#undef glBufferSubData
#undef GL_ARRAY_BUFFER
#define glGenBuffers glGenBuffersARB
#define glDeleteBuffers glDeleteBuffersARB
#define glBindBuffer glBindBufferARB
#define glBufferData glBufferDataARB
#define glBufferSubData glBufferSubDataARB
#define GL_ARRAY_BUFFER GL_ARRAY_BUFFER_ARB
#undef glEnableVertexAttribArray
#undef glDisableVertexAttribArray
#undef glVertexAttribPointer
#define glEnableVertexAttribArray glEnableVertexAttribArrayARB
#define glDisableVertexAttribArray glDisableVertexAttribArrayARB
#define glVertexAttribPointer glVertexAttribPointerARB
#endif
#define GPU_CONTEXT_DATA ContextData_OpenGL_1
#define GPU_IMAGE_DATA ImageData_OpenGL_1
#define GPU_TARGET_DATA TargetData_OpenGL_1
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 110\n\
\
attribute vec2 gpu_Vertex;\n\
attribute vec2 gpu_TexCoord;\n\
attribute vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying vec4 color;\n\
varying vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
// Tier 3 uses shader attributes to send position, texcoord, and color data for each vertex.
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 110\n\
\
attribute vec2 gpu_Vertex;\n\
attribute vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 110\n\
\
varying vec4 color;\n\
varying vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
void main(void)\n\
{\n\
gl_FragColor = texture2D(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 110\n\
\
varying vec4 color;\n\
\
void main(void)\n\
{\n\
gl_FragColor = color;\n\
}"
typedef struct ContextData_OpenGL_1
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices and 4 tex coords interleaved (e.g. [x0, y0, z0, s0, t0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_OpenGL_1;
typedef struct ImageData_OpenGL_1
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_OpenGL_1;
typedef struct TargetData_OpenGL_1
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_OpenGL_1;
#endif

View file

@ -0,0 +1,80 @@
#ifndef _SDL_GPU_OPENGL_1_BASE_H__
#define _SDL_GPU_OPENGL_1_BASE_H__
#include "SDL_gpu.h"
#if !defined(SDL_GPU_DISABLE_OPENGL) && !defined(SDL_GPU_DISABLE_OPENGL_1_BASE)
// Hacks to fix compile errors due to polluted namespace
#ifdef _WIN32
#define _WINUSER_H
#define _WINGDI_H
#endif
#include "glew.h"
#if defined(GL_EXT_bgr) && !defined(GL_BGR)
#define GL_BGR GL_BGR_EXT
#endif
#if defined(GL_EXT_bgra) && !defined(GL_BGRA)
#define GL_BGRA GL_BGRA_EXT
#endif
#if defined(GL_EXT_abgr) && !defined(GL_ABGR)
#define GL_ABGR GL_ABGR_EXT
#endif
#undef GL_MIRRORED_REPEAT
#define GL_MIRRORED_REPEAT GL_MIRRORED_REPEAT_ARB
#endif
#define GPU_CONTEXT_DATA ContextData_OpenGL_1_BASE
#define GPU_IMAGE_DATA ImageData_OpenGL_1_BASE
#define GPU_TARGET_DATA TargetData_OpenGL_1_BASE
typedef struct ContextData_OpenGL_1_BASE
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices and 4 tex coords interleaved (e.g. [x0, y0, z0, s0, t0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
} ContextData_OpenGL_1_BASE;
typedef struct ImageData_OpenGL_1_BASE
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_OpenGL_1_BASE;
typedef struct TargetData_OpenGL_1_BASE
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_OpenGL_1_BASE;
#endif

View file

@ -0,0 +1,144 @@
#ifndef _SDL_GPU_OPENGL_2_H__
#define _SDL_GPU_OPENGL_2_H__
#include "SDL_gpu.h"
#if !defined(SDL_GPU_DISABLE_OPENGL) && !defined(SDL_GPU_DISABLE_OPENGL_2)
// Hacks to fix compile errors due to polluted namespace
#ifdef _WIN32
#define _WINUSER_H
#define _WINGDI_H
#endif
#include "glew.h"
#if defined(GL_EXT_bgr) && !defined(GL_BGR)
#define GL_BGR GL_BGR_EXT
#endif
#if defined(GL_EXT_bgra) && !defined(GL_BGRA)
#define GL_BGRA GL_BGRA_EXT
#endif
#if defined(GL_EXT_abgr) && !defined(GL_ABGR)
#define GL_ABGR GL_ABGR_EXT
#endif
#endif
#define GPU_CONTEXT_DATA ContextData_OpenGL_2
#define GPU_IMAGE_DATA ImageData_OpenGL_2
#define GPU_TARGET_DATA TargetData_OpenGL_2
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 120\n\
\
attribute vec2 gpu_Vertex;\n\
attribute vec2 gpu_TexCoord;\n\
attribute vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying vec4 color;\n\
varying vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
// Tier 3 uses shader attributes to send position, texcoord, and color data for each vertex.
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 120\n\
\
attribute vec2 gpu_Vertex;\n\
attribute vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
varying vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 120\n\
\
varying vec4 color;\n\
varying vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
void main(void)\n\
{\n\
gl_FragColor = texture2D(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 120\n\
\
varying vec4 color;\n\
\
void main(void)\n\
{\n\
gl_FragColor = color;\n\
}"
typedef struct ContextData_OpenGL_2
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices and 4 tex coords interleaved (e.g. [x0, y0, z0, s0, t0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_OpenGL_2;
typedef struct ImageData_OpenGL_2
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_OpenGL_2;
typedef struct TargetData_OpenGL_2
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_OpenGL_2;
#endif

View file

@ -0,0 +1,208 @@
#ifndef _SDL_GPU_OPENGL_3_H__
#define _SDL_GPU_OPENGL_3_H__
#include "SDL_gpu.h"
#if !defined(SDL_GPU_DISABLE_OPENGL) && !defined(SDL_GPU_DISABLE_OPENGL_3)
// Hacks to fix compile errors due to polluted namespace
#ifdef _WIN32
#define _WINUSER_H
#define _WINGDI_H
#endif
#include "glew.h"
#if defined(GL_EXT_bgr) && !defined(GL_BGR)
#define GL_BGR GL_BGR_EXT
#endif
#if defined(GL_EXT_bgra) && !defined(GL_BGRA)
#define GL_BGRA GL_BGRA_EXT
#endif
#if defined(GL_EXT_abgr) && !defined(GL_ABGR)
#define GL_ABGR GL_ABGR_EXT
#endif
#endif
#define GPU_CONTEXT_DATA ContextData_OpenGL_3
#define GPU_IMAGE_DATA ImageData_OpenGL_3
#define GPU_TARGET_DATA TargetData_OpenGL_3
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 130\n\
\
in vec2 gpu_Vertex;\n\
in vec2 gpu_TexCoord;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
out vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
// Tier 3 uses shader attributes to send position, texcoord, and color data for each vertex.
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 130\n\
\
in vec2 gpu_Vertex;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 130\n\
\
in vec4 color;\n\
in vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
void main(void)\n\
{\n\
gl_FragColor = texture2D(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 130\n\
\
in vec4 color;\n\
\
void main(void)\n\
{\n\
gl_FragColor = color;\n\
}"
// OpenGL 3.2 and 3.3 need newer shaders in case a core profile is used
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE_CORE \
"#version 150\n\
\
in vec2 gpu_Vertex;\n\
in vec2 gpu_TexCoord;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
out vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE_CORE \
"#version 150\n\
\
in vec2 gpu_Vertex;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE_CORE \
"#version 150\n\
\
in vec4 color;\n\
in vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = texture(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE_CORE \
"#version 150\n\
\
in vec4 color;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = color;\n\
}"
typedef struct ContextData_OpenGL_3
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices, each with interleaved position, tex coords, and colors (e.g. [x0, y0, z0, s0, t0, r0, g0, b0, a0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
// Tier 3 rendering
unsigned int blit_VAO;
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_OpenGL_3;
typedef struct ImageData_OpenGL_3
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_OpenGL_3;
typedef struct TargetData_OpenGL_3
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_OpenGL_3;
#endif

View file

@ -0,0 +1,146 @@
#ifndef _SDL_GPU_OPENGL_4_H__
#define _SDL_GPU_OPENGL_4_H__
#include "SDL_gpu.h"
#if !defined(SDL_GPU_DISABLE_OPENGL) && !defined(SDL_GPU_DISABLE_OPENGL_4)
// Hacks to fix compile errors due to polluted namespace
#ifdef _WIN32
#define _WINUSER_H
#define _WINGDI_H
#endif
#include "glew.h"
#if defined(GL_EXT_bgr) && !defined(GL_BGR)
#define GL_BGR GL_BGR_EXT
#endif
#if defined(GL_EXT_bgra) && !defined(GL_BGRA)
#define GL_BGRA GL_BGRA_EXT
#endif
#if defined(GL_EXT_abgr) && !defined(GL_ABGR)
#define GL_ABGR GL_ABGR_EXT
#endif
#endif
#define GPU_CONTEXT_DATA ContextData_OpenGL_4
#define GPU_IMAGE_DATA ImageData_OpenGL_4
#define GPU_TARGET_DATA TargetData_OpenGL_4
#define GPU_DEFAULT_TEXTURED_VERTEX_SHADER_SOURCE \
"#version 400\n\
\
in vec2 gpu_Vertex;\n\
in vec2 gpu_TexCoord;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
out vec2 texCoord;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
texCoord = vec2(gpu_TexCoord);\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_UNTEXTURED_VERTEX_SHADER_SOURCE \
"#version 400\n\
\
in vec2 gpu_Vertex;\n\
in vec4 gpu_Color;\n\
uniform mat4 gpu_ModelViewProjectionMatrix;\n\
\
out vec4 color;\n\
\
void main(void)\n\
{\n\
color = gpu_Color;\n\
gl_Position = gpu_ModelViewProjectionMatrix * vec4(gpu_Vertex, 0.0, 1.0);\n\
}"
#define GPU_DEFAULT_TEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 400\n\
\
in vec4 color;\n\
in vec2 texCoord;\n\
\
uniform sampler2D tex;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = texture(tex, texCoord) * color;\n\
}"
#define GPU_DEFAULT_UNTEXTURED_FRAGMENT_SHADER_SOURCE \
"#version 400\n\
\
in vec4 color;\n\
\
out vec4 fragColor;\n\
\
void main(void)\n\
{\n\
fragColor = color;\n\
}"
typedef struct ContextData_OpenGL_4
{
SDL_Color last_color;
GPU_bool last_use_texturing;
unsigned int last_shape;
GPU_bool last_use_blending;
GPU_BlendMode last_blend_mode;
GPU_Rect last_viewport;
GPU_Camera last_camera;
GPU_bool last_camera_inverted;
GPU_bool last_depth_test;
GPU_bool last_depth_write;
GPU_ComparisonEnum last_depth_function;
GPU_Image* last_image;
float* blit_buffer; // Holds sets of 4 vertices, each with interleaved position, tex coords, and colors (e.g. [x0, y0, z0, s0, t0, r0, g0, b0, a0, ...]).
unsigned short blit_buffer_num_vertices;
unsigned short blit_buffer_max_num_vertices;
unsigned short* index_buffer; // Indexes into the blit buffer so we can use 4 vertices for every 2 triangles (1 quad)
unsigned int index_buffer_num_vertices;
unsigned int index_buffer_max_num_vertices;
// Tier 3 rendering
unsigned int blit_VAO;
unsigned int blit_VBO[2]; // For double-buffering
unsigned int blit_IBO;
GPU_bool blit_VBO_flop;
GPU_AttributeSource shader_attributes[16];
unsigned int attribute_VBO[16];
} ContextData_OpenGL_4;
typedef struct ImageData_OpenGL_4
{
int refcount;
GPU_bool owns_handle;
Uint32 handle;
Uint32 format;
} ImageData_OpenGL_4;
typedef struct TargetData_OpenGL_4
{
int refcount;
Uint32 handle;
Uint32 format;
} TargetData_OpenGL_4;
#endif

View file

@ -0,0 +1,327 @@
#ifndef _GPU_RENDERERIMPL_H__
#define _GPU_RENDERERIMPL_H__
#include "SDL_gpu.h"
#ifdef __cplusplus
extern "C" {
#endif
// Internal API for managing window mappings
DECLSPEC void SDLCALL GPU_AddWindowMapping(GPU_Target* target);
DECLSPEC void SDLCALL GPU_RemoveWindowMapping(Uint32 windowID);
DECLSPEC void SDLCALL GPU_RemoveWindowMappingByTarget(GPU_Target* target);
/*! Private implementation of renderer members. */
typedef struct GPU_RendererImpl
{
/*! \see GPU_Init()
* \see GPU_InitRenderer()
* \see GPU_InitRendererByID()
*/
GPU_Target* (SDLCALL *Init)(GPU_Renderer* renderer, GPU_RendererID renderer_request, Uint16 w, Uint16 h, GPU_WindowFlagEnum SDL_flags);
/*! \see GPU_CreateTargetFromWindow
* The extra parameter is used internally to reuse/reinit a target. */
GPU_Target* (SDLCALL *CreateTargetFromWindow)(GPU_Renderer* renderer, Uint32 windowID, GPU_Target* target);
/*! \see GPU_SetActiveTarget() */
GPU_bool (SDLCALL *SetActiveTarget)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_CreateAliasTarget() */
GPU_Target* (SDLCALL *CreateAliasTarget)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_MakeCurrent */
void (SDLCALL *MakeCurrent)(GPU_Renderer* renderer, GPU_Target* target, Uint32 windowID);
/*! Sets up this renderer to act as the current renderer. Called automatically by GPU_SetCurrentRenderer(). */
void (SDLCALL *SetAsCurrent)(GPU_Renderer* renderer);
/*! \see GPU_ResetRendererState() */
void (SDLCALL *ResetRendererState)(GPU_Renderer* renderer);
/*! \see GPU_AddDepthBuffer() */
GPU_bool (SDLCALL *AddDepthBuffer)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_SetWindowResolution() */
GPU_bool (SDLCALL *SetWindowResolution)(GPU_Renderer* renderer, Uint16 w, Uint16 h);
/*! \see GPU_SetVirtualResolution() */
void (SDLCALL *SetVirtualResolution)(GPU_Renderer* renderer, GPU_Target* target, Uint16 w, Uint16 h);
/*! \see GPU_UnsetVirtualResolution() */
void (SDLCALL *UnsetVirtualResolution)(GPU_Renderer* renderer, GPU_Target* target);
/*! Clean up the renderer state. */
void (SDLCALL *Quit)(GPU_Renderer* renderer);
/*! \see GPU_SetFullscreen() */
GPU_bool (SDLCALL *SetFullscreen)(GPU_Renderer* renderer, GPU_bool enable_fullscreen, GPU_bool use_desktop_resolution);
/*! \see GPU_SetCamera() */
GPU_Camera (SDLCALL *SetCamera)(GPU_Renderer* renderer, GPU_Target* target, GPU_Camera* cam);
/*! \see GPU_CreateImage() */
GPU_Image* (SDLCALL *CreateImage)(GPU_Renderer* renderer, Uint16 w, Uint16 h, GPU_FormatEnum format);
/*! \see GPU_CreateImageUsingTexture() */
GPU_Image* (SDLCALL *CreateImageUsingTexture)(GPU_Renderer* renderer, GPU_TextureHandle handle, GPU_bool take_ownership);
/*! \see GPU_CreateAliasImage() */
GPU_Image* (SDLCALL *CreateAliasImage)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_SaveImage() */
GPU_bool (SDLCALL *SaveImage)(GPU_Renderer* renderer, GPU_Image* image, const char* filename, GPU_FileFormatEnum format);
/*! \see GPU_CopyImage() */
GPU_Image* (SDLCALL *CopyImage)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_UpdateImage */
void (SDLCALL *UpdateImage)(GPU_Renderer* renderer, GPU_Image* image, const GPU_Rect* image_rect, SDL_Surface* surface, const GPU_Rect* surface_rect);
/*! \see GPU_UpdateImageBytes */
void (SDLCALL *UpdateImageBytes)(GPU_Renderer* renderer, GPU_Image* image, const GPU_Rect* image_rect, const unsigned char* bytes, int bytes_per_row);
/*! \see GPU_ReplaceImage */
GPU_bool (SDLCALL *ReplaceImage)(GPU_Renderer* renderer, GPU_Image* image, SDL_Surface* surface, const GPU_Rect* surface_rect);
/*! \see GPU_CopyImageFromSurface() */
GPU_Image* (SDLCALL *CopyImageFromSurface)(GPU_Renderer* renderer, SDL_Surface* surface, GPU_Rect *surface_rect);
/*! \see GPU_CopyImageFromTarget() */
GPU_Image* (SDLCALL *CopyImageFromTarget)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_CopySurfaceFromTarget() */
SDL_Surface* (SDLCALL *CopySurfaceFromTarget)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_CopySurfaceFromImage() */
SDL_Surface* (SDLCALL *CopySurfaceFromImage)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_FreeImage() */
void (SDLCALL *FreeImage)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_GetTarget() */
GPU_Target* (SDLCALL *GetTarget)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_FreeTarget() */
void (SDLCALL *FreeTarget)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_Blit() */
void (SDLCALL *Blit)(GPU_Renderer* renderer, GPU_Image* image, GPU_Rect* src_rect, GPU_Target* target, float x, float y);
/*! \see GPU_BlitRotate() */
void (SDLCALL *BlitRotate)(GPU_Renderer* renderer, GPU_Image* image, GPU_Rect* src_rect, GPU_Target* target, float x, float y, float degrees);
/*! \see GPU_BlitScale() */
void (SDLCALL *BlitScale)(GPU_Renderer* renderer, GPU_Image* image, GPU_Rect* src_rect, GPU_Target* target, float x, float y, float scaleX, float scaleY);
/*! \see GPU_BlitTransform */
void (SDLCALL *BlitTransform)(GPU_Renderer* renderer, GPU_Image* image, GPU_Rect* src_rect, GPU_Target* target, float x, float y, float degrees, float scaleX, float scaleY);
/*! \see GPU_BlitTransformX() */
void (SDLCALL *BlitTransformX)(GPU_Renderer* renderer, GPU_Image* image, GPU_Rect* src_rect, GPU_Target* target, float x, float y, float pivot_x, float pivot_y, float degrees, float scaleX, float scaleY);
/*! \see GPU_PrimitiveBatchV() */
void (SDLCALL *PrimitiveBatchV)(GPU_Renderer* renderer, GPU_Image* image, GPU_Target* target, GPU_PrimitiveEnum primitive_type, unsigned short num_vertices, void* values, unsigned int num_indices, unsigned short* indices, GPU_BatchFlagEnum flags);
/*! \see GPU_GenerateMipmaps() */
void (SDLCALL *GenerateMipmaps)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_SetClip() */
GPU_Rect (SDLCALL *SetClip)(GPU_Renderer* renderer, GPU_Target* target, Sint16 x, Sint16 y, Uint16 w, Uint16 h);
/*! \see GPU_UnsetClip() */
void (SDLCALL *UnsetClip)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_GetPixel() */
SDL_Color (SDLCALL *GetPixel)(GPU_Renderer* renderer, GPU_Target* target, Sint16 x, Sint16 y);
/*! \see GPU_SetImageFilter() */
void (SDLCALL *SetImageFilter)(GPU_Renderer* renderer, GPU_Image* image, GPU_FilterEnum filter);
/*! \see GPU_SetWrapMode() */
void (SDLCALL *SetWrapMode)(GPU_Renderer* renderer, GPU_Image* image, GPU_WrapEnum wrap_mode_x, GPU_WrapEnum wrap_mode_y);
/*! \see GPU_GetTextureHandle() */
GPU_TextureHandle (SDLCALL *GetTextureHandle)(GPU_Renderer* renderer, GPU_Image* image);
/*! \see GPU_ClearRGBA() */
void (SDLCALL *ClearRGBA)(GPU_Renderer* renderer, GPU_Target* target, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
/*! \see GPU_FlushBlitBuffer() */
void (SDLCALL *FlushBlitBuffer)(GPU_Renderer* renderer);
/*! \see GPU_Flip() */
void (SDLCALL *Flip)(GPU_Renderer* renderer, GPU_Target* target);
/*! \see GPU_CreateShaderProgram() */
Uint32 (SDLCALL *CreateShaderProgram)(GPU_Renderer* renderer);
/*! \see GPU_FreeShaderProgram() */
void (SDLCALL *FreeShaderProgram)(GPU_Renderer* renderer, Uint32 program_object);
/*! \see GPU_CompileShader_RW() */
Uint32 (SDLCALL *CompileShader_RW)(GPU_Renderer* renderer, GPU_ShaderEnum shader_type, SDL_RWops* shader_source, GPU_bool free_rwops);
/*! \see GPU_CompileShader() */
Uint32 (SDLCALL *CompileShader)(GPU_Renderer* renderer, GPU_ShaderEnum shader_type, const char* shader_source);
/*! \see GPU_FreeShader() */
void (SDLCALL *FreeShader)(GPU_Renderer* renderer, Uint32 shader_object);
/*! \see GPU_AttachShader() */
void (SDLCALL *AttachShader)(GPU_Renderer* renderer, Uint32 program_object, Uint32 shader_object);
/*! \see GPU_DetachShader() */
void (SDLCALL *DetachShader)(GPU_Renderer* renderer, Uint32 program_object, Uint32 shader_object);
/*! \see GPU_LinkShaderProgram() */
GPU_bool (SDLCALL *LinkShaderProgram)(GPU_Renderer* renderer, Uint32 program_object);
/*! \see GPU_ActivateShaderProgram() */
void (SDLCALL *ActivateShaderProgram)(GPU_Renderer* renderer, Uint32 program_object, GPU_ShaderBlock* block);
/*! \see GPU_DeactivateShaderProgram() */
void (SDLCALL *DeactivateShaderProgram)(GPU_Renderer* renderer);
/*! \see GPU_GetShaderMessage() */
const char* (SDLCALL *GetShaderMessage)(GPU_Renderer* renderer);
/*! \see GPU_GetAttribLocation() */
int (SDLCALL *GetAttributeLocation)(GPU_Renderer* renderer, Uint32 program_object, const char* attrib_name);
/*! \see GPU_GetUniformLocation() */
int (SDLCALL *GetUniformLocation)(GPU_Renderer* renderer, Uint32 program_object, const char* uniform_name);
/*! \see GPU_LoadShaderBlock() */
GPU_ShaderBlock (SDLCALL *LoadShaderBlock)(GPU_Renderer* renderer, Uint32 program_object, const char* position_name, const char* texcoord_name, const char* color_name, const char* modelViewMatrix_name);
/*! \see GPU_SetShaderBlock() */
void (SDLCALL *SetShaderBlock)(GPU_Renderer* renderer, GPU_ShaderBlock block);
/*! \see GPU_SetShaderImage() */
void (SDLCALL *SetShaderImage)(GPU_Renderer* renderer, GPU_Image* image, int location, int image_unit);
/*! \see GPU_GetUniformiv() */
void (SDLCALL *GetUniformiv)(GPU_Renderer* renderer, Uint32 program_object, int location, int* values);
/*! \see GPU_SetUniformi() */
void (SDLCALL *SetUniformi)(GPU_Renderer* renderer, int location, int value);
/*! \see GPU_SetUniformiv() */
void (SDLCALL *SetUniformiv)(GPU_Renderer* renderer, int location, int num_elements_per_value, int num_values, int* values);
/*! \see GPU_GetUniformuiv() */
void (SDLCALL *GetUniformuiv)(GPU_Renderer* renderer, Uint32 program_object, int location, unsigned int* values);
/*! \see GPU_SetUniformui() */
void (SDLCALL *SetUniformui)(GPU_Renderer* renderer, int location, unsigned int value);
/*! \see GPU_SetUniformuiv() */
void (SDLCALL *SetUniformuiv)(GPU_Renderer* renderer, int location, int num_elements_per_value, int num_values, unsigned int* values);
/*! \see GPU_GetUniformfv() */
void (SDLCALL *GetUniformfv)(GPU_Renderer* renderer, Uint32 program_object, int location, float* values);
/*! \see GPU_SetUniformf() */
void (SDLCALL *SetUniformf)(GPU_Renderer* renderer, int location, float value);
/*! \see GPU_SetUniformfv() */
void (SDLCALL *SetUniformfv)(GPU_Renderer* renderer, int location, int num_elements_per_value, int num_values, float* values);
/*! \see GPU_SetUniformMatrixfv() */
void (SDLCALL *SetUniformMatrixfv)(GPU_Renderer* renderer, int location, int num_matrices, int num_rows, int num_columns, GPU_bool transpose, float* values);
/*! \see GPU_SetAttributef() */
void (SDLCALL *SetAttributef)(GPU_Renderer* renderer, int location, float value);
/*! \see GPU_SetAttributei() */
void (SDLCALL *SetAttributei)(GPU_Renderer* renderer, int location, int value);
/*! \see GPU_SetAttributeui() */
void (SDLCALL *SetAttributeui)(GPU_Renderer* renderer, int location, unsigned int value);
/*! \see GPU_SetAttributefv() */
void (SDLCALL *SetAttributefv)(GPU_Renderer* renderer, int location, int num_elements, float* value);
/*! \see GPU_SetAttributeiv() */
void (SDLCALL *SetAttributeiv)(GPU_Renderer* renderer, int location, int num_elements, int* value);
/*! \see GPU_SetAttributeuiv() */
void (SDLCALL *SetAttributeuiv)(GPU_Renderer* renderer, int location, int num_elements, unsigned int* value);
/*! \see GPU_SetAttributeSource() */
void (SDLCALL *SetAttributeSource)(GPU_Renderer* renderer, int num_values, GPU_Attribute source);
// Shapes
/*! \see GPU_SetLineThickness() */
float (SDLCALL *SetLineThickness)(GPU_Renderer* renderer, float thickness);
/*! \see GPU_GetLineThickness() */
float (SDLCALL *GetLineThickness)(GPU_Renderer* renderer);
/*! \see GPU_Pixel() */
void (SDLCALL *Pixel)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, SDL_Color color);
/*! \see GPU_Line() */
void (SDLCALL *Line)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, SDL_Color color);
/*! \see GPU_Arc() */
void (SDLCALL *Arc)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float radius, float start_angle, float end_angle, SDL_Color color);
/*! \see GPU_ArcFilled() */
void (SDLCALL *ArcFilled)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float radius, float start_angle, float end_angle, SDL_Color color);
/*! \see GPU_Circle() */
void (SDLCALL *Circle)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float radius, SDL_Color color);
/*! \see GPU_CircleFilled() */
void (SDLCALL *CircleFilled)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float radius, SDL_Color color);
/*! \see GPU_Ellipse() */
void (SDLCALL *Ellipse)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float rx, float ry, float degrees, SDL_Color color);
/*! \see GPU_EllipseFilled() */
void (SDLCALL *EllipseFilled)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float rx, float ry, float degrees, SDL_Color color);
/*! \see GPU_Sector() */
void (SDLCALL *Sector)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float inner_radius, float outer_radius, float start_angle, float end_angle, SDL_Color color);
/*! \see GPU_SectorFilled() */
void (SDLCALL *SectorFilled)(GPU_Renderer* renderer, GPU_Target* target, float x, float y, float inner_radius, float outer_radius, float start_angle, float end_angle, SDL_Color color);
/*! \see GPU_Tri() */
void (SDLCALL *Tri)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, float x3, float y3, SDL_Color color);
/*! \see GPU_TriFilled() */
void (SDLCALL *TriFilled)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, float x3, float y3, SDL_Color color);
/*! \see GPU_Rectangle() */
void (SDLCALL *Rectangle)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, SDL_Color color);
/*! \see GPU_RectangleFilled() */
void (SDLCALL *RectangleFilled)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, SDL_Color color);
/*! \see GPU_RectangleRound() */
void (SDLCALL *RectangleRound)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, float radius, SDL_Color color);
/*! \see GPU_RectangleRoundFilled() */
void (SDLCALL *RectangleRoundFilled)(GPU_Renderer* renderer, GPU_Target* target, float x1, float y1, float x2, float y2, float radius, SDL_Color color);
/*! \see GPU_Polygon() */
void (SDLCALL *Polygon)(GPU_Renderer* renderer, GPU_Target* target, unsigned int num_vertices, float* vertices, SDL_Color color);
/*! \see GPU_Polyline() */
void (SDLCALL *Polyline)(GPU_Renderer* renderer, GPU_Target* target, unsigned int num_vertices, float* vertices, SDL_Color color, GPU_bool close_loop);
/*! \see GPU_PolygonFilled() */
void (SDLCALL *PolygonFilled)(GPU_Renderer* renderer, GPU_Target* target, unsigned int num_vertices, float* vertices, SDL_Color color);
} GPU_RendererImpl;
#ifdef __cplusplus
}
#endif
#endif

View file

@ -0,0 +1,8 @@
#ifndef _SDL_GPU_VERSION_H__
#define _SDL_GPU_VERSION_H__
#define SDL_GPU_VERSION_MAJOR 0
#define SDL_GPU_VERSION_MINOR 12
#define SDL_GPU_VERSION_PATCH 0
#endif

View file

@ -36,6 +36,8 @@
#include "sdfml/music.hpp" #include "sdfml/music.hpp"
#include "SDL_gpu/SDL_gpu.h"
#ifdef _WIN32 #ifdef _WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) #define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)
#else #else
@ -69,6 +71,12 @@ enum lLOG_TYPE {
ERROR_ ERROR_
}; };
enum AXIS {
X,
Y,
XY
};
typedef HWND mWin; typedef HWND mWin;
inline std::string _GetCurrentDirectory() inline std::string _GetCurrentDirectory()
@ -124,6 +132,7 @@ namespace sdfml {
static string soundfont = DEFAULT_SF; static string soundfont = DEFAULT_SF;
struct context { struct context {
GPU_Target* gpu_render;
SDL_Window* window; SDL_Window* window;
SDL_Renderer* renderer; SDL_Renderer* renderer;
SDL_Event events; SDL_Event events;
@ -137,12 +146,11 @@ namespace sdfml {
}; };
static context mContext; static context mContext;
static SoLoud::SoundFont sf;
class sdSprite { class sdSprite {
public: public:
int x, y, width, height; int x, y, width, height;
double angle = 0; double angle = 0.000001;
double alpha = 1.0; double alpha = 1.0;
Vector2f scale = {1, 1}; Vector2f scale = {1, 1};
@ -151,12 +159,13 @@ namespace sdfml {
virtual void create(int x, int y, string path) { virtual void create(int x, int y, string path) {
this->x = x; this->x = x;
this->y = y; this->y = y;
_tex = STBIMG_LoadTexture(mContext.renderer, path.c_str()); _tex_gpu = GPU_LoadImage(path.c_str());
SDL_SetTextureBlendMode(_tex, SDL_BLENDMODE_BLEND); GPU_SetBlendMode(_tex_gpu, GPU_BLEND_NORMAL);
SDL_QueryTexture(_tex, NULL, NULL, &width, &height); width = _tex_gpu->w;
height = _tex_gpu->h;
} }
SDL_Rect emptyRect = {0, 0, 0, 0}; SDL_Rect emptyRect = {0, 0, 0, 0};
SDL_Rect *r; GPU_Rect *r;
virtual void update(float elapsed) { virtual void update(float elapsed) {
_x = x+offset.x; _x = x+offset.x;
_y = y+offset.y; _y = y+offset.y;
@ -168,13 +177,13 @@ namespace sdfml {
_sc.w = _w; _sc.w = _w;
_sc.h = _h; _sc.h = _h;
SDL_SetTextureAlphaMod(_tex, alpha*255); // GPU_SetRGBA(_tex_gpu, 255, 255, 255, alpha*255);
r = &_src_rect; r = &_src_rect;
if (r == &emptyRect) if (r->w == 0)
r = NULL; r = NULL;
SDL_RenderCopyEx(mContext.renderer, _tex, r, &_sc, angle, NULL, SDL_FLIP_NONE); GPU_BlitRectX(_tex_gpu, r, mContext.gpu_render, &_sc, angle, NULL, NULL, GPU_FLIP_NONE);
} }
virtual void destroy() { virtual void destroy() {
_x = 0; _x = 0;
@ -182,29 +191,34 @@ namespace sdfml {
_w = 0; _w = 0;
_h = 0; _h = 0;
_sc = {0, 0, 0, 0}; _sc = {0, 0, 0, 0};
SDL_DestroyTexture(_tex); GPU_FreeImage(_tex_gpu);
}
virtual SDL_Rect get_sc() {
return _sc;
}
virtual void set_sc(SDL_Rect rect) {
_sc = rect;
}
virtual void src_rect(SDL_Rect rect) {
_src_rect = rect;
} }
virtual void updateCamera(SDL_Rect* camera) { virtual void updateCamera(SDL_Rect* camera) {
_camera = camera; _camera = camera;
} }
private: virtual void screenCenter(AXIS axis = XY) {
switch (axis) {
case X:
x = (mContext.size.x/2) - (width*scale.x/2);
break;
case Y:
y = (mContext.size.y/2) - (height*scale.y/2);
break;
case XY:
x = (mContext.size.x/2) - (width*scale.x/2);
y = (mContext.size.y/2) - (height*scale.y/2);
break;
}
}
protected:
int _x, _y, _w, _h; int _x, _y, _w, _h;
SDL_Rect _sc; GPU_Rect _sc;
SDL_Rect _src_rect = {0, 0, 0, 0}; GPU_Rect _src_rect = {0, 0, 0, 0};
SDL_Rect dummy = {0, 0, 0, 0}; SDL_Rect dummy = {0, 0, 0, 0};
sdCam _cam; sdCam _cam;
SDL_Rect* _camera = &dummy; SDL_Rect* _camera = &dummy;
SDL_Texture* _tex; GPU_Image* _tex_gpu;
}; };
inline void focusCamera(SDL_Rect* camera, sdSprite sprite) { inline void focusCamera(SDL_Rect* camera, sdSprite sprite) {
@ -260,7 +274,7 @@ namespace sdfml {
height = (frameRects[current_framename][current_frame].h)*scale.y; height = (frameRects[current_framename][current_frame].h)*scale.y;
// after setting shit up, we then store it in src_rect. // after setting shit up, we then store it in src_rect.
src_rect({sx, sy, sw, sh}); _src_rect = {static_cast<float>(sx), static_cast<float>(sy), static_cast<float>(sw), static_cast<float>(sh)};
} }
} }
@ -282,11 +296,10 @@ namespace sdfml {
} }
virtual void draw(float elapsed) { virtual void draw(float elapsed) {
SDL_RenderClear(mContext.renderer); GPU_Clear(mContext.gpu_render);
for (int i = 0; i < _sprites.size(); i++) { for (int i = 0; i < _sprites.size(); i++) {
_sprites[i]->update(elapsed); _sprites[i]->update(elapsed);
} }
SDL_RenderPresent(mContext.renderer);
} }
virtual void add(sdSprite* p_spr, bool mut = false) { virtual void add(sdSprite* p_spr, bool mut = false) {
// a mutable sprite cannot be changed after being added. // a mutable sprite cannot be changed after being added.
@ -370,18 +383,15 @@ namespace sdfml {
return llog("SDL_ttf", " has failed to initialize.", ERROR_, __FILENAME__, __LINE__); return llog("SDL_ttf", " has failed to initialize.", ERROR_, __FILENAME__, __LINE__);
llog("SDL_ttf", " is now initialized.", NORMAL, __FILENAME__, __LINE__); llog("SDL_ttf", " is now initialized.", NORMAL, __FILENAME__, __LINE__);
llog("", "Initialized libraries. Creating a window context.", NORMAL, __FILENAME__, __LINE__); llog("", "Initialized libraries. Creating a window context.", NORMAL, __FILENAME__, __LINE__);
mContext.window = SDL_CreateWindow(window_name.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, (int)width, (int)height, win_flags); GPU_SetPreInitFlags(GPU_INIT_DISABLE_VSYNC);
if (mContext.window == nullptr) mContext.gpu_render = GPU_Init(width, height, GPU_DEFAULT_INIT_FLAGS);
return llog("", "Failed to create a window.", ERROR_, __FILENAME__, __LINE__);
mContext.renderer = SDL_CreateRenderer(mContext.window, -1, SDL_RENDERER_ACCELERATED);
if (mContext.renderer == nullptr)
return llog("", "Failed to create a renderer.", ERROR_, __FILENAME__, __LINE__);
sf.load(soundfont.c_str()); SDL_SetWindowTitle(SDL_GetWindowFromID(mContext.gpu_render->context->windowID), window_name.c_str());
//sound.music.loadSoundfont(soundfont);
SDL_SysWMinfo wmInfo; SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version); SDL_VERSION(&wmInfo.version);
SDL_GetWindowWMInfo(mContext.window, &wmInfo); SDL_GetWindowWMInfo(SDL_GetWindowFromID(mContext.gpu_render->context->windowID), &wmInfo);
mContext.direct_win = wmInfo.info.win.window; mContext.direct_win = wmInfo.info.win.window;
SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE);
@ -434,6 +444,8 @@ namespace sdfml {
return FRAMERATE*time; return FRAMERATE*time;
} }
static double elapsed;
inline int update() { inline int update() {
int lastUpdate = SDL_GetTicks(); int lastUpdate = SDL_GetTicks();
bool run = true; bool run = true;
@ -492,7 +504,11 @@ namespace sdfml {
kb_last = SDL_GetKeyboardState(NULL); kb_last = SDL_GetKeyboardState(NULL);
elapsed += 1;
SDL_Delay(floor((1000.0f/FRAMERATE) - elapsedMS)); SDL_Delay(floor((1000.0f/FRAMERATE) - elapsedMS));
GPU_Flip(mContext.gpu_render);
} }
if (curState->get_spr().size() > 0) { if (curState->get_spr().size() > 0) {
@ -505,8 +521,7 @@ namespace sdfml {
texture.destroy(); texture.destroy();
} }
} }
SDL_DestroyRenderer(mContext.renderer); GPU_Quit();
SDL_DestroyWindow(mContext.window);
sound.deinit(); sound.deinit();
ReleaseConsole(); ReleaseConsole();
TTF_Quit(); TTF_Quit();

View file

@ -1,6 +1,10 @@
#include "music.hpp" #include "music.hpp"
std::array<SoLoud::WavStream, MAX_SFX> sdfml::sfxBanks; std::array<SoLoud::WavStream, MAX_SFX> sdfml::sfxBanks;
#ifdef PREFER_MODPLUG
std::pair<SoLoud::WavStream, SoLoud::Modplug> sdfml::musicBank;
#else
std::pair<SoLoud::WavStream, SoLoud::Openmpt> sdfml::musicBank; std::pair<SoLoud::WavStream, SoLoud::Openmpt> sdfml::musicBank;
#endif
SoLoud::Soloud sdfml::audio; SoLoud::Soloud sdfml::audio;
sdfml::AudioHandler sdfml::sound; sdfml::AudioHandler sdfml::sound;

View file

@ -5,6 +5,7 @@
#include "../SoLoud/soloud_speech.h" #include "../SoLoud/soloud_speech.h"
#include "../SoLoud/soloud_modplug.h" #include "../SoLoud/soloud_modplug.h"
#include "../SoLoud/soloud_openmpt.h" #include "../SoLoud/soloud_openmpt.h"
#include "../SoLoud/MIDI/soloud_midi.h"
#include <array> #include <array>
#include <string> #include <string>
#include <utility> #include <utility>
@ -14,16 +15,22 @@
namespace sdfml { namespace sdfml {
extern std::array<SoLoud::WavStream, MAX_SFX> sfxBanks; extern std::array<SoLoud::WavStream, MAX_SFX> sfxBanks;
#ifdef PREFER_MODPLUG
extern std::pair<SoLoud::WavStream, SoLoud::Modplug> musicBank;
#else
extern std::pair<SoLoud::WavStream, SoLoud::Openmpt> musicBank; extern std::pair<SoLoud::WavStream, SoLoud::Openmpt> musicBank;
#endif
extern SoLoud::Soloud audio; extern SoLoud::Soloud audio;
class MusicHandler { class MusicHandler {
public: public:
void playMusic(std::string path) { void playMusic(std::string path) {
musicBank.first.stop(); musicBank.first.stop();
audio.stopAudioSource(musicBank.first); audio.stopAudioSource(musicBank.first);
musicBank.first.load(path.c_str()); musicBank.first.load(path.c_str());
musicBank.first.setLooping(true);
audio.play(musicBank.first); audio.play(musicBank.first);
} }
@ -31,6 +38,7 @@ namespace sdfml {
musicBank.second.stop(); musicBank.second.stop();
audio.stopAudioSource(musicBank.second); audio.stopAudioSource(musicBank.second);
musicBank.second.load(path.c_str()); musicBank.second.load(path.c_str());
musicBank.second.setLooping(true);
audio.playBackground(musicBank.second); audio.playBackground(musicBank.second);
} }
}; };