diff --git a/.gitignore b/.gitignore index 77b158b..735959a 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ trick.ini project.xcworkspace/ xcuserdata/ *.opk +.vscode/* \ No newline at end of file diff --git a/.vscode/configurationCache.log b/.vscode/configurationCache.log deleted file mode 100644 index e014552..0000000 --- a/.vscode/configurationCache.log +++ /dev/null @@ -1 +0,0 @@ -{"buildTargets":["all","clean","debug"],"launchTargets":["/Users/raimonzamora/dev/proj/aee>aee()"],"customConfigurationProvider":{"workspaceBrowse":{"browsePath":["/Users/raimonzamora/dev/proj/aee"],"compilerArgs":["-lSDL2","-lSDL2_mixer","-o","aee","-lSDL2","-lSDL2_mixer","-o","aee","-lSDL2","-lSDL2_mixer","-o","aee","-g","-lSDL2","-lSDL2_mixer","-o","aee"],"compilerPath":"/usr/bin/g++","standard":"c++11","windowsSdkVersion":""},"fileIndex":[["/Users/raimonzamora/dev/proj/aee/*.cpp",{"uri":{"$mid":1,"fsPath":"/Users/raimonzamora/dev/proj/aee/*.cpp","path":"/Users/raimonzamora/dev/proj/aee/*.cpp","scheme":"file"},"configuration":{"defines":[],"standard":"c++11","includePath":[],"forcedInclude":[],"intelliSenseMode":"gcc-x64","compilerPath":"/usr/bin/g++","compilerArgs":["-g","-lSDL2","-lSDL2_mixer","-o","aee"],"windowsSdkVersion":""}}]]}} \ No newline at end of file diff --git a/.vscode/dryrun.log b/.vscode/dryrun.log deleted file mode 100644 index b3ed2b0..0000000 --- a/.vscode/dryrun.log +++ /dev/null @@ -1,5 +0,0 @@ -make debug --dry-run --keep-going --print-directory -make: Entering directory `/Users/raimonzamora/dev/proj/aee' -g++ *.cpp -g -std=c++11 -lSDL2 -lSDL2_mixer -o aee -make: Leaving directory `/Users/raimonzamora/dev/proj/aee' - diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 760a59c..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "makefile.extensionOutputFolder": "./.vscode", - "makefile.launchConfigurations": [ - { - "cwd": "/Users/raimonzamora/dev/proj/aee", - "binaryPath": "/Users/raimonzamora/dev/proj/aee/aee", - "binaryArgs": [] - } - ] -} \ No newline at end of file diff --git a/.vscode/targets.log b/.vscode/targets.log deleted file mode 100644 index 6d5ff31..0000000 --- a/.vscode/targets.log +++ /dev/null @@ -1,257 +0,0 @@ -make all --print-data-base --no-builtin-variables --no-builtin-rules --question -# GNU Make 3.81 -# Copyright (C) 2006 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. -# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# This program built for i386-apple-darwin11.3.0 - - -# Make data base, printed on Wed Sep 1 20:00:35 2021 - - -# Variables - -# automatic -/dev/null || echo /Developer)/Makefiles -# environment -VSCODE_CLI = 1 -# environment -VSCODE_CODE_CACHE_PATH = /Users/raimonzamora/Library/Application Support/Code/CachedData/3866c3553be8b268c8a7f8c0482c0c0177aa8bfa -# environment -LOGNAME = raimonzamora -# environment -APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL = true -# environment -VSCODE_HANDLES_UNCAUGHT_ERRORS = true -# automatic -^D = $(patsubst %/,%,$(dir $^)) -# environment -XPC_FLAGS = 0x0 -# default -MAKE = $(MAKE_COMMAND) -# default -MAKECMDGOALS := all -# environment -SHLVL = 3 -# default -MAKE_VERSION := 3.81 -# environment -USER = raimonzamora -# makefile -.DEFAULT_GOAL := all -# environment -TERM_SESSION_ID = 765A9C16-03F5-46AC-A0BE-B297B910335E -# automatic -%D = $(patsubst %/,%,$(dir $%)) -# default -MAKE_COMMAND := /Library/Developer/CommandLineTools/usr/bin/make -# environment -TERM_PROGRAM = Apple_Terminal -# default -.VARIABLES := -# environment -TMPDIR = /var/folders/jb/tqpp4m1j50d3gjsyry8hwypm0000gn/T/ -# automatic -*F = $(notdir $*) -# environment -VSCODE_IPC_HOOK = /Users/raimonzamora/Library/Application Support/Code/1.59.1-main.sock -# makefile -MAKEFLAGS = Rrqp -# environment -MFLAGS = -Rrqp -# automatic -*D = $(patsubst %/,%,$(dir $*)) -# environment -TERM_PROGRAM_VERSION = 440 -# environment -XPC_SERVICE_NAME = 0 -# automatic -+D = $(patsubst %/,%,$(dir $+)) -# automatic -+F = $(notdir $+) -# environment -__CF_USER_TEXT_ENCODING = 0x1F5:0x0:0x8 -# environment -COMMAND_MODE = unix2003 -# default -MAKEFILES := -# environment -VSCODE_BROWSER_CODE_LOADING = bypassHeatCheck -# automatic - #include "gif.h" +#include "jshader.h" #ifdef GCWZERO #define SCREEN_WIDTH 320 #define SCREEN_HEIGHT 240 #else -#define SCREEN_WIDTH 640 -#define SCREEN_HEIGHT 480 +#define SCREEN_WIDTH 960 +#define SCREEN_HEIGHT 720 #endif JD8_Surface screen = NULL; @@ -25,6 +26,7 @@ char *fps = (char *)malloc(10); SDL_Window* sdlWindow = NULL; SDL_Renderer* sdlRenderer = NULL; SDL_Texture* sdlTexture = NULL; +SDL_Texture* backBuffer = NULL; void JD8_Init(const char *title) { screen = (JD8_Surface)calloc( 1, 64000 ); @@ -32,10 +34,18 @@ void JD8_Init(const char *title) { pixel_data = (Uint32*)calloc(1, 320 * 200 * 4); // 1048576 ); sdlWindow = SDL_CreateWindow( title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN ); - sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, 0); + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest"); + sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); sdlTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, 320, 200); + backBuffer = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 320, 200); + + int filesize = 0; + char *buffer = JF_GetBufferFromResource("crtpi.glsl", filesize, true); + + shader::init(sdlWindow, backBuffer, buffer); + free(buffer); } void JD8_Quit() { @@ -180,8 +190,10 @@ void JD8_Flip() { } } SDL_UpdateTexture(sdlTexture, NULL, pixel_data, 320 * sizeof(Uint32)); - SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &rect); - SDL_RenderPresent(sdlRenderer); + SDL_SetRenderTarget(sdlRenderer, backBuffer); + SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, NULL); + shader::render(); + //SDL_RenderPresent(sdlRenderer); } void JD8_FreeSurface(JD8_Surface surface) { diff --git a/jdraw8.h b/jdraw8.h old mode 100755 new mode 100644 diff --git a/jfile.cpp b/jfile.cpp old mode 100755 new mode 100644 index 5e409dc..11fd610 --- a/jfile.cpp +++ b/jfile.cpp @@ -56,7 +56,7 @@ void JF_GetDataFile() { fd.close(); } -char *JF_GetBufferFromResource(const char *resourcename, int& filesize) { +char *JF_GetBufferFromResource(const char *resourcename, int& filesize, const bool addZero) { if( data_file == NULL ) { JF_GetDataFile(); @@ -85,11 +85,12 @@ char *JF_GetBufferFromResource(const char *resourcename, int& filesize) { fd.seekg( data_file->index.file_info[count].offset ); - char* buffer = (char*)malloc( filesize ); + char* buffer = (char*)malloc( filesize + (addZero ? 1 : 0) ); fd.read( buffer, filesize ); - fd.close(); + if (addZero) buffer[filesize] = 0; + return buffer; } diff --git a/jfile.h b/jfile.h old mode 100755 new mode 100644 index 57155bc..55c7e0d --- a/jfile.h +++ b/jfile.h @@ -2,6 +2,6 @@ void JF_SetResourceFile(const char *p_resourceFileName); -char *JF_GetBufferFromResource(const char *resourcename, int& filesize); +char *JF_GetBufferFromResource(const char *resourcename, int& filesize, const bool addZero=false); void JF_Quit(); \ No newline at end of file diff --git a/jgame.cpp b/jgame.cpp old mode 100755 new mode 100644 diff --git a/jgame.h b/jgame.h old mode 100755 new mode 100644 diff --git a/jinput.cpp b/jinput.cpp old mode 100755 new mode 100644 diff --git a/jinput.h b/jinput.h old mode 100755 new mode 100644 diff --git a/jshader.cpp b/jshader.cpp new file mode 100644 index 0000000..06ea620 --- /dev/null +++ b/jshader.cpp @@ -0,0 +1,229 @@ +#include "jshader.h" + +#include + +#ifdef __APPLE__ +#include "CoreFoundation/CoreFoundation.h" +#include + +#if ESSENTIAL_GL_PRACTICES_SUPPORT_GL3 +#include +#else +#include +#endif //!ESSENTIAL_GL_PRACTICES_SUPPORT_GL3 +#else +#include +#include +#endif + +namespace shader +{ + SDL_Window *win = nullptr; + SDL_Renderer *renderer = nullptr; + GLuint programId = 0; + SDL_Texture* backBuffer = nullptr; + SDL_Point win_size = {640, 480}; + SDL_Point tex_size = {320, 240}; + bool usingOpenGL; + + #ifndef __APPLE__ + + // I'm avoiding the use of GLEW or some extensions handler, but that + // doesn't mean you should... + PFNGLCREATESHADERPROC glCreateShader; + PFNGLSHADERSOURCEPROC glShaderSource; + PFNGLCOMPILESHADERPROC glCompileShader; + PFNGLGETSHADERIVPROC glGetShaderiv; + PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; + PFNGLDELETESHADERPROC glDeleteShader; + PFNGLATTACHSHADERPROC glAttachShader; + PFNGLCREATEPROGRAMPROC glCreateProgram; + PFNGLLINKPROGRAMPROC glLinkProgram; + PFNGLVALIDATEPROGRAMPROC glValidateProgram; + PFNGLGETPROGRAMIVPROC glGetProgramiv; + PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; + PFNGLUSEPROGRAMPROC glUseProgram; + + bool initGLExtensions() { + glCreateShader = (PFNGLCREATESHADERPROC)SDL_GL_GetProcAddress("glCreateShader"); + glShaderSource = (PFNGLSHADERSOURCEPROC)SDL_GL_GetProcAddress("glShaderSource"); + glCompileShader = (PFNGLCOMPILESHADERPROC)SDL_GL_GetProcAddress("glCompileShader"); + glGetShaderiv = (PFNGLGETSHADERIVPROC)SDL_GL_GetProcAddress("glGetShaderiv"); + glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)SDL_GL_GetProcAddress("glGetShaderInfoLog"); + glDeleteShader = (PFNGLDELETESHADERPROC)SDL_GL_GetProcAddress("glDeleteShader"); + glAttachShader = (PFNGLATTACHSHADERPROC)SDL_GL_GetProcAddress("glAttachShader"); + glCreateProgram = (PFNGLCREATEPROGRAMPROC)SDL_GL_GetProcAddress("glCreateProgram"); + glLinkProgram = (PFNGLLINKPROGRAMPROC)SDL_GL_GetProcAddress("glLinkProgram"); + glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)SDL_GL_GetProcAddress("glValidateProgram"); + glGetProgramiv = (PFNGLGETPROGRAMIVPROC)SDL_GL_GetProcAddress("glGetProgramiv"); + glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)SDL_GL_GetProcAddress("glGetProgramInfoLog"); + glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram"); + + return glCreateShader && glShaderSource && glCompileShader && glGetShaderiv && + glGetShaderInfoLog && glDeleteShader && glAttachShader && glCreateProgram && + glLinkProgram && glValidateProgram && glGetProgramiv && glGetProgramInfoLog && + glUseProgram; + } + + #endif + + GLuint compileShader(const char* source, GLuint shaderType) { + // Create ID for shader + GLuint result = glCreateShader(shaderType); + // Add define depending on shader type + const char *sources[2] = { shaderType==GL_VERTEX_SHADER?"#define VERTEX\n":"#define FRAGMENT\n", source }; + // Define shader text + glShaderSource(result, 2, sources, NULL); + // Compile shader + glCompileShader(result); + + //Check vertex shader for errors + GLint shaderCompiled = GL_FALSE; + glGetShaderiv( result, GL_COMPILE_STATUS, &shaderCompiled ); + if( shaderCompiled != GL_TRUE ) { + std::cout << "Error en la compilación: " << result << "!" << std::endl; + GLint logLength; + glGetShaderiv(result, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar*)malloc(logLength); + glGetShaderInfoLog(result, logLength, &logLength, log); + std::cout << "Shader compile log:" << log << std::endl; + free(log); + } + glDeleteShader(result); + result = 0; +// } else { +// std::cout << "Shader compilado correctamente. Id = " << result << std::endl; + } + return result; + } + + GLuint compileProgram(const char* vertexShaderSource, const char* fragmentShaderSource) { + GLuint programId = 0; + GLuint vtxShaderId, fragShaderId; + + programId = glCreateProgram(); + + vtxShaderId = compileShader(vertexShaderSource, GL_VERTEX_SHADER); + fragShaderId = compileShader(fragmentShaderSource?fragmentShaderSource:vertexShaderSource, GL_FRAGMENT_SHADER); + + if(vtxShaderId && fragShaderId) { + // Associate shader with program + glAttachShader(programId, vtxShaderId); + glAttachShader(programId, fragShaderId); + glLinkProgram(programId); + glValidateProgram(programId); + + // Check the status of the compile/link + GLint logLen; + glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &logLen); + if(logLen > 0) { + char* log = (char*) malloc(logLen * sizeof(char)); + // Show any errors as appropriate + glGetProgramInfoLog(programId, logLen, &logLen, log); + std::cout << "Prog Info Log: " << std::endl << log << std::endl; + free(log); + } + } + if(vtxShaderId) { + glDeleteShader(vtxShaderId); + } + if(fragShaderId) { + glDeleteShader(fragShaderId); + } + return programId; + } + + const bool init(SDL_Window* win, SDL_Texture* backBuffer, const char* vertexShader, const char* fragmentShader) + { + shader::win = win; + shader::renderer = SDL_GetRenderer(win); + shader::backBuffer = backBuffer; + SDL_GetWindowSize(win, &win_size.x, &win_size.y); + int access; + SDL_QueryTexture(backBuffer, NULL, &access, &tex_size.x, &tex_size.y); + if (access != SDL_TEXTUREACCESS_TARGET) + { + std::cout << "ERROR FATAL: La textura per al render ha de tindre SDL_TEXTUREACCESS_TARGET definit." << std::endl; + exit(1); + } + + SDL_RendererInfo rendererInfo; + SDL_GetRendererInfo(renderer, &rendererInfo); + + if(!strncmp(rendererInfo.name, "opengl", 6)) { + //std::cout << "Es OpenGL!" << std::endl; + #ifndef __APPLE__ + if (!initGLExtensions()) { + std::cout << "WARNING: No s'han pogut inicialitzar les extensions d'OpenGL!" << std::endl; + usingOpenGL = false; + return false; + } + #endif + // Compilar el shader y dejarlo listo para usar. + programId = compileProgram(vertexShader, fragmentShader); + //std::cout << "programId = " << programId << std::endl; + } else { + std::cout << "WARNING: El driver del renderer no es OpenGL." << std::endl; + usingOpenGL = false; + return false; + } + usingOpenGL = true; + return true; + } + + void render() + { + GLint oldProgramId; + // Guarrada para obtener el textureid (en driverdata->texture) + //Detach the texture + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + + SDL_SetRenderTarget(renderer, NULL); + SDL_RenderClear(renderer); + + if (usingOpenGL) { + SDL_GL_BindTexture(backBuffer, NULL, NULL); + if(programId != 0) { + glGetIntegerv(GL_CURRENT_PROGRAM,&oldProgramId); + glUseProgram(programId); + } + + GLfloat minx, miny, maxx, maxy; + GLfloat minu, maxu, minv, maxv; + + // Coordenadas de la ventana donde pintar. + minx = 0.0f; + miny = 0.0f; + maxx = tex_size.x; + maxy = tex_size.y; + + minu = 0.0f; + maxu = 1.0f; + minv = 0.0f; + maxv = 1.0f; + + glViewport(0, 0, win_size.x, win_size.y); + + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(minu, minv); + glVertex2f(minx, miny); + glTexCoord2f(maxu, minv); + glVertex2f(maxx, miny); + glTexCoord2f(minu, maxv); + glVertex2f(minx, maxy); + glTexCoord2f(maxu, maxv); + glVertex2f(maxx, maxy); + glEnd(); + SDL_GL_SwapWindow(win); + + if(programId != 0) { + glUseProgram(oldProgramId); + } + } else { + SDL_RenderCopy(renderer, backBuffer, NULL, NULL); + SDL_RenderPresent(renderer); + } + } +} diff --git a/jshader.h b/jshader.h new file mode 100644 index 0000000..556f796 --- /dev/null +++ b/jshader.h @@ -0,0 +1,44 @@ +#pragma once + +#include + +// TIPS: +// ======================================================================= +// Abans de crear el renderer, cridar a la següent funció: +// +// SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); +// +// Aixó li diu que volem un renderer que use especificament opengl. A més, +// al crear el renderer li tenim que dir que el volem que use acceeració +// per hardware, i que soporte render a textura. Per exemple: +// +// SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | +// SDL_RENDERER_TARGETTEXTURE); +// +// Per altra part, al crear la textura tenim que definir que puga ser target +// de renderitzat (SDL_TEXTUREACCESS_TARGET), per exemple: +// +// SDL_Texture *tex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, +// SDL_TEXTUREACCESS_TARGET, 320, 240); +// +// Els shaders li'ls passem com una cadena, som nosaltres els que s'encarreguem +// de carregarlos de disc, amb fopen, ifstream, jfile o el que vullgues. +// Si els tens en un std::string, passa-li-la com "cadena.c_str()". +// +// Poden ser els dos el mateix arxiu, com fa libRetro, jo desde dins ja fique +// els defines necessaris. Si es el mateix arxiu, pots no ficar el quart paràmetre. +// +// Els shaders de libRetro no funcionen directament, hi ha que fer algunes modificacions. +// +// El pintat final de la teua escena l'has de fer com si "backBuffer" fora la pantalla. +// +// Ah! una cosa mes: al compilar, en Linux afegir "-lGL", en Windows afegir "-lopengl32". +// En Mac ni idea + +namespace shader +{ + const bool init(SDL_Window* win, SDL_Texture* backBuffer, + const char* vertexShader, const char* fragmentShader=nullptr); + + void render(); +} diff --git a/jsound.cpp b/jsound.cpp old mode 100755 new mode 100644 diff --git a/jsound.h b/jsound.h old mode 100755 new mode 100644 diff --git a/main.cpp b/main.cpp old mode 100755 new mode 100644 diff --git a/makefile b/makefile old mode 100755 new mode 100644 index 2aa3d81..9248eac --- a/makefile +++ b/makefile @@ -1,9 +1,9 @@ TARGET=aee -all: - g++ *.cpp -std=c++11 -lSDL2 -lSDL2_mixer -o $(TARGET) +linux: + g++ *.cpp -lSDL2 -lSDL2_mixer -lGL -o $(TARGET) -debug: - g++ *.cpp -g -std=c++11 -lSDL2 -lSDL2_mixer -o $(TARGET) +windows: + g++ *.cpp -lmingw32 -lSDL2 -lSDL2_mixer -lopengl32 -mwindows -o $(TARGET) clean: rm -rf ./$(TARGET) diff --git a/mapa.cpp b/mapa.cpp old mode 100755 new mode 100644 diff --git a/mapa.h b/mapa.h old mode 100755 new mode 100644 diff --git a/marcador.cpp b/marcador.cpp old mode 100755 new mode 100644 diff --git a/marcador.h b/marcador.h old mode 100755 new mode 100644 diff --git a/modulegame.cpp b/modulegame.cpp old mode 100755 new mode 100644 diff --git a/modulegame.h b/modulegame.h old mode 100755 new mode 100644 diff --git a/modulesequence.cpp b/modulesequence.cpp old mode 100755 new mode 100644 diff --git a/modulesequence.h b/modulesequence.h old mode 100755 new mode 100644 diff --git a/momia.cpp b/momia.cpp old mode 100755 new mode 100644 diff --git a/momia.h b/momia.h old mode 100755 new mode 100644 diff --git a/prota.cpp b/prota.cpp old mode 100755 new mode 100644 diff --git a/prota.h b/prota.h old mode 100755 new mode 100644 diff --git a/sprite.cpp b/sprite.cpp old mode 100755 new mode 100644 diff --git a/sprite.h b/sprite.h old mode 100755 new mode 100644