mirror of https://github.com/snes9xgit/snes9x.git
More prep of shader files.
This commit is contained in:
parent
29241c9cde
commit
2b5d9af6ca
|
@ -19,67 +19,6 @@ static const GLfloat mvp_ortho[16] = { 2.0f, 0.0f, 0.0f, 0.0f,
|
||||||
0.0f, 0.0f, -1.0f, 0.0f,
|
0.0f, 0.0f, -1.0f, 0.0f,
|
||||||
-1.0f, -1.0f, 0.0f, 1.0f };
|
-1.0f, -1.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
static void reduce_to_path(char* filename)
|
|
||||||
{
|
|
||||||
for (int i = strlen(filename); i >= 0; i--)
|
|
||||||
{
|
|
||||||
if (filename[i] == '\\' || filename[i] == '/')
|
|
||||||
{
|
|
||||||
filename[i] = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *read_file(const char *filename)
|
|
||||||
{
|
|
||||||
FILE *file = NULL;
|
|
||||||
int size;
|
|
||||||
char *contents;
|
|
||||||
|
|
||||||
file = fopen(filename, "rb");
|
|
||||||
if (!file)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
fseek(file, 0, SEEK_END);
|
|
||||||
size = ftell(file);
|
|
||||||
fseek(file, 0, SEEK_SET);
|
|
||||||
|
|
||||||
contents = new char[size + 1];
|
|
||||||
fread(contents, size, 1, file);
|
|
||||||
contents[size] = '\0';
|
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
return contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> read_file_lines(const char *filename)
|
|
||||||
{
|
|
||||||
std::vector<std::string> lines;
|
|
||||||
|
|
||||||
char *file_contents = read_file(filename);
|
|
||||||
if (!file_contents)
|
|
||||||
return lines;
|
|
||||||
|
|
||||||
std::string string_contents(file_contents);
|
|
||||||
delete[] file_contents;
|
|
||||||
|
|
||||||
for (char &c : string_contents)
|
|
||||||
{
|
|
||||||
if (c == '\r')
|
|
||||||
c = '\n';
|
|
||||||
}
|
|
||||||
|
|
||||||
std::istringstream ss(string_contents);
|
|
||||||
std::string line;
|
|
||||||
|
|
||||||
while (std::getline(ss, line, '\n'))
|
|
||||||
if (!line.empty())
|
|
||||||
lines.push_back(line);
|
|
||||||
|
|
||||||
return std::move(lines);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int scale_string_to_enum(const char *string, bool last)
|
static int scale_string_to_enum(const char *string, bool last)
|
||||||
{
|
{
|
||||||
if (!strcasecmp(string, "source"))
|
if (!strcasecmp(string, "source"))
|
||||||
|
@ -398,20 +337,6 @@ bool GLSLShader::load_shader(char *filename)
|
||||||
if (!load_shader_preset_file(filename))
|
if (!load_shader_preset_file(filename))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/*
|
|
||||||
for (unsigned int i = 1; i < pass.size(); i++)
|
|
||||||
{
|
|
||||||
if (pass[i].alias && *pass[i].alias)
|
|
||||||
{
|
|
||||||
aliases += "#define ";
|
|
||||||
aliases += pass[i].alias;
|
|
||||||
aliases += " Pass";
|
|
||||||
aliases += std::to_string(i - 1);
|
|
||||||
aliases += "Texture\n";
|
|
||||||
printf ("%s\n", aliases.c_str());
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
for (unsigned int i = 1; i < pass.size(); i++)
|
for (unsigned int i = 1; i < pass.size(); i++)
|
||||||
{
|
{
|
||||||
GLSLPass *p = &pass[i];
|
GLSLPass *p = &pass[i];
|
||||||
|
@ -420,7 +345,9 @@ bool GLSLShader::load_shader(char *filename)
|
||||||
realpath(p->filename, temp);
|
realpath(p->filename, temp);
|
||||||
strcpy(p->filename, temp);
|
strcpy(p->filename, temp);
|
||||||
|
|
||||||
auto lines = read_file_lines(p->filename);
|
std::vector<std::string> lines;
|
||||||
|
read_shader_file_with_includes(p->filename, lines);
|
||||||
|
|
||||||
if (lines.empty())
|
if (lines.empty())
|
||||||
{
|
{
|
||||||
printf("Couldn't read shader file %s\n", temp);
|
printf("Couldn't read shader file %s\n", temp);
|
||||||
|
|
|
@ -151,14 +151,10 @@ bool loadPngImage(const char *name, int &outWidth, int &outHeight,
|
||||||
memcpy(*outData + (row_bytes * i), row_pointers[i], row_bytes);
|
memcpy(*outData + (row_bytes * i), row_pointers[i], row_bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean up after the read,
|
|
||||||
* and free any memory allocated */
|
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
|
||||||
|
|
||||||
/* Close the file */
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
/* That's it */
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
@ -199,19 +195,17 @@ bool loadTGA(const char *filename, STGA &tgaFile)
|
||||||
|
|
||||||
long imageSize = tgaFile.width * tgaFile.height * tgaFile.byteCount;
|
long imageSize = tgaFile.width * tgaFile.height * tgaFile.byteCount;
|
||||||
|
|
||||||
// allocate memory for image data
|
|
||||||
unsigned char *tempBuf = new unsigned char[imageSize];
|
unsigned char *tempBuf = new unsigned char[imageSize];
|
||||||
tgaFile.data = new unsigned char[tgaFile.width * tgaFile.height * 4];
|
tgaFile.data = new unsigned char[tgaFile.width * tgaFile.height * 4];
|
||||||
|
|
||||||
// read in image data
|
|
||||||
fread(tempBuf, sizeof(unsigned char), imageSize, file);
|
fread(tempBuf, sizeof(unsigned char), imageSize, file);
|
||||||
|
|
||||||
// swap line order and convert to RBGA
|
// swap line order and convert to RGBA
|
||||||
for (int i = 0; i < tgaFile.height; i++)
|
for (int i = 0; i < tgaFile.height; i++)
|
||||||
{
|
{
|
||||||
unsigned char *source = tempBuf + tgaFile.width *
|
unsigned char *source = tempBuf + tgaFile.width *
|
||||||
(tgaFile.height - 1 - i) *
|
(tgaFile.height - 1 - i) *
|
||||||
tgaFile.byteCount;
|
tgaFile.byteCount;
|
||||||
unsigned char *destination = tgaFile.data + tgaFile.width * i * 4;
|
unsigned char *destination = tgaFile.data + tgaFile.width * i * 4;
|
||||||
for (int j = 0; j < tgaFile.width; j++)
|
for (int j = 0; j < tgaFile.width; j++)
|
||||||
{
|
{
|
||||||
|
@ -226,8 +220,99 @@ bool loadTGA(const char *filename, STGA &tgaFile)
|
||||||
delete[] tempBuf;
|
delete[] tempBuf;
|
||||||
tgaFile.byteCount = 4;
|
tgaFile.byteCount = 4;
|
||||||
|
|
||||||
// close file
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reduce_to_path(char *filename)
|
||||||
|
{
|
||||||
|
for (int i = strlen(filename); i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (filename[i] == '\\' || filename[i] == '/')
|
||||||
|
{
|
||||||
|
filename[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string folder_from_path(std::string filename)
|
||||||
|
{
|
||||||
|
for (int i = filename.length() - 1; i >= 0; i--)
|
||||||
|
if (filename[i] == '\\' || filename[i] == '/')
|
||||||
|
return filename.substr(0, i);
|
||||||
|
|
||||||
|
return std::string(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *read_file(const char *filename)
|
||||||
|
{
|
||||||
|
FILE *file = NULL;
|
||||||
|
int size;
|
||||||
|
char *contents;
|
||||||
|
|
||||||
|
file = fopen(filename, "rb");
|
||||||
|
if (!file)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
size = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
|
contents = new char[size + 1];
|
||||||
|
fread(contents, size, 1, file);
|
||||||
|
contents[size] = '\0';
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
return contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string canonicalize(const std::string &noncanonical)
|
||||||
|
{
|
||||||
|
char *temp = realpath(noncanonical.c_str(), NULL);
|
||||||
|
std::string filename_string(temp);
|
||||||
|
free(temp);
|
||||||
|
return std::move(filename_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// filename must be canonical
|
||||||
|
void read_shader_file_with_includes(std::string filename,
|
||||||
|
std::vector<std::string> &lines)
|
||||||
|
{
|
||||||
|
char *file_contents = read_file(filename.c_str());
|
||||||
|
if (!file_contents)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string string_contents(file_contents);
|
||||||
|
delete[] file_contents;
|
||||||
|
|
||||||
|
for (char &c : string_contents)
|
||||||
|
{
|
||||||
|
if (c == '\r')
|
||||||
|
c = '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
std::istringstream ss(string_contents);
|
||||||
|
std::string line;
|
||||||
|
|
||||||
|
while (std::getline(ss, line, '\n'))
|
||||||
|
{
|
||||||
|
if (line.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (line.find("#include") == 0)
|
||||||
|
{
|
||||||
|
char tmp[PATH_MAX];
|
||||||
|
sscanf(line.c_str(), "#include \"%[^\"]\"", tmp);
|
||||||
|
|
||||||
|
std::string fullpath = canonicalize(folder_from_path(filename) + "/" + tmp);
|
||||||
|
read_shader_file_with_includes(fullpath.c_str(), lines);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lines.push_back(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,9 @@
|
||||||
#define __SHADER_HELPERS_H
|
#define __SHADER_HELPERS_H
|
||||||
|
|
||||||
#include "shader_platform.h"
|
#include "shader_platform.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
typedef struct _STGA
|
typedef struct _STGA
|
||||||
{
|
{
|
||||||
|
@ -44,5 +47,7 @@ void gl_log_errors();
|
||||||
bool gl_srgb_available();
|
bool gl_srgb_available();
|
||||||
int gl_version();
|
int gl_version();
|
||||||
bool gl_float_texture_available();
|
bool gl_float_texture_available();
|
||||||
|
void reduce_to_path(char* filename);
|
||||||
|
void read_shader_file_with_includes(std::string filename, std::vector<std::string> &lines);
|
||||||
|
|
||||||
#endif // __SHADER_HELPERS_H
|
#endif // __SHADER_HELPERS_H
|
||||||
|
|
Loading…
Reference in New Issue