mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-07-14 13:22:23 +08:00
+ Comments to FileResolver
~ Limit projects to scenes only ~ Updated shader definitions to compile all the WallpaperEngine shaders + Documented shader compiler Signed-off-by: Alexis Maiquez <almamu@almamu.com>
This commit is contained in:
parent
f5ff11995a
commit
1c9db8c159
@ -4,6 +4,7 @@ project(wallengine)
|
|||||||
set(CMAKE_CXX_STANDARD 11)
|
set(CMAKE_CXX_STANDARD 11)
|
||||||
set(CMAKE_CXX_FLAGS "-fpermissive")
|
set(CMAKE_CXX_FLAGS "-fpermissive")
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||||
|
set(OpenGL_GL_PREFERENCE "LEGACY")
|
||||||
|
|
||||||
find_package(X11 REQUIRED)
|
find_package(X11 REQUIRED)
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
@ -13,6 +14,6 @@ find_package(Irrlicht REQUIRED)
|
|||||||
|
|
||||||
include_directories(${X11_INCLUDE_DIR} ${IRRLICHT_INCLUDE_DIR} .)
|
include_directories(${X11_INCLUDE_DIR} ${IRRLICHT_INCLUDE_DIR} .)
|
||||||
|
|
||||||
add_executable(wallengine main.cpp common.h wallpaperengine/shaders/compiler.h wallpaperengine/shaders/compiler.cpp wallpaperengine/project.cpp wallpaperengine/project.h wallpaperengine/scene.cpp wallpaperengine/scene.h wallpaperengine/object.cpp wallpaperengine/object.h wallpaperengine/camera.cpp wallpaperengine/camera.h wallpaperengine/core.cpp wallpaperengine/core.h wallpaperengine/image.cpp wallpaperengine/image.h wallpaperengine/object3d.cpp wallpaperengine/object3d.h wallpaperengine/effect.cpp wallpaperengine/effect.h wallpaperengine/fs/fileResolver.cpp wallpaperengine/fs/fileResolver.h wallpaperengine/irrlicht.cpp wallpaperengine/irrlicht.h wallpaperengine/config.cpp wallpaperengine/config.h wallpaperengine/video/renderer.cpp wallpaperengine/video/renderer.h wallpaperengine/video/node.cpp wallpaperengine/video/node.h wallpaperengine/video/material.cpp wallpaperengine/video/material.h wallpaperengine/texture.cpp wallpaperengine/texture.h)
|
add_executable(wallengine main.cpp wallpaperengine/shaders/compiler.h wallpaperengine/shaders/compiler.cpp wallpaperengine/project.cpp wallpaperengine/project.h wallpaperengine/scene.cpp wallpaperengine/scene.h wallpaperengine/object.cpp wallpaperengine/object.h wallpaperengine/camera.cpp wallpaperengine/camera.h wallpaperengine/core.cpp wallpaperengine/core.h wallpaperengine/image.cpp wallpaperengine/image.h wallpaperengine/object3d.cpp wallpaperengine/object3d.h wallpaperengine/effect.cpp wallpaperengine/effect.h wallpaperengine/fs/fileResolver.cpp wallpaperengine/fs/fileResolver.h wallpaperengine/irrlicht.cpp wallpaperengine/irrlicht.h wallpaperengine/config.cpp wallpaperengine/config.h wallpaperengine/video/renderer.cpp wallpaperengine/video/renderer.h wallpaperengine/video/node.cpp wallpaperengine/video/node.h wallpaperengine/video/material.cpp wallpaperengine/video/material.h wallpaperengine/texture.cpp wallpaperengine/texture.h)
|
||||||
|
|
||||||
target_link_libraries(wallengine ${X11_LIBRARIES} ${X11_Xxf86vm_LIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${ZLIB_LIBRARIES} ${IRRLICHT_LIBRARY})
|
target_link_libraries(wallengine ${X11_LIBRARIES} ${X11_Xxf86vm_LIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${ZLIB_LIBRARIES} ${IRRLICHT_LIBRARY})
|
14
docs/TEXTURE_FORMAT.md
Normal file
14
docs/TEXTURE_FORMAT.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Texture format
|
||||||
|
Wallpaper engine uses a custom texture format converted by resourcecompiler.exe
|
||||||
|
|
||||||
|
## Header
|
||||||
|
|
||||||
|
| Type indicator |
|
||||||
|
|---|
|
||||||
|
| 8 bytes |
|
||||||
|
|
||||||
|
#### Format
|
||||||
|
|
||||||
|
| |
|
||||||
|
|---|
|
||||||
|
| |
|
@ -1,3 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* @author Alexis Maiquez Murcia <almamu@almamu.com>
|
||||||
|
*/
|
||||||
#ifndef WALLENGINE_RESOLVER_H
|
#ifndef WALLENGINE_RESOLVER_H
|
||||||
#define WALLENGINE_RESOLVER_H
|
#define WALLENGINE_RESOLVER_H
|
||||||
|
|
||||||
@ -9,20 +12,70 @@
|
|||||||
namespace wp
|
namespace wp
|
||||||
{
|
{
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
namespace fs
|
namespace fs
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Custom file resolver to limit our searches to specific folders
|
||||||
|
*/
|
||||||
class fileResolver
|
class fileResolver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Basic constructor, uses current path as base folder
|
||||||
|
*/
|
||||||
fileResolver ();
|
fileResolver ();
|
||||||
|
/**
|
||||||
|
* Creates a file resolver using a list as environment folders
|
||||||
|
*
|
||||||
|
* @param environment List of directories to use for finding files
|
||||||
|
*/
|
||||||
fileResolver (std::vector<irr::io::path> environment);
|
fileResolver (std::vector<irr::io::path> environment);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new folder to the environment list
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
*/
|
||||||
void appendEnvironment (irr::io::path path);
|
void appendEnvironment (irr::io::path path);
|
||||||
|
/**
|
||||||
|
* Removes the given folder from the environment list
|
||||||
|
*
|
||||||
|
* @param path
|
||||||
|
*/
|
||||||
void removeEnvironment (irr::io::path path);
|
void removeEnvironment (irr::io::path path);
|
||||||
|
/**
|
||||||
|
* Updates the current working directory
|
||||||
|
*
|
||||||
|
* @param newpath
|
||||||
|
*/
|
||||||
void changeWorkingDirectory (irr::io::path newpath);
|
void changeWorkingDirectory (irr::io::path newpath);
|
||||||
|
/**
|
||||||
|
* @return The current working directory
|
||||||
|
*/
|
||||||
irr::io::path getWorkingDirectory ();
|
irr::io::path getWorkingDirectory ();
|
||||||
|
/**
|
||||||
|
* @return A clone of this fileResolver
|
||||||
|
*/
|
||||||
fileResolver clone ();
|
fileResolver clone ();
|
||||||
|
/**
|
||||||
|
* Resolves the given filename or relative path
|
||||||
|
* on the current working directory or any of the registered
|
||||||
|
* environment folders
|
||||||
|
*
|
||||||
|
* @param name The filename/relative path to resolve
|
||||||
|
*
|
||||||
|
* @return The full path to the file
|
||||||
|
*/
|
||||||
irr::io::path resolve (irr::io::path name);
|
irr::io::path resolve (irr::io::path name);
|
||||||
|
/**
|
||||||
|
* Resolves the given filename or relative path
|
||||||
|
* on the current working directory only
|
||||||
|
*
|
||||||
|
* @param name The filename/relative path to resolve
|
||||||
|
*
|
||||||
|
* @return The full path to the file
|
||||||
|
*/
|
||||||
irr::io::path resolveOnWorkingDirectory (irr::io::path name);
|
irr::io::path resolveOnWorkingDirectory (irr::io::path name);
|
||||||
irr::io::path resolve (json name);
|
irr::io::path resolve (json name);
|
||||||
irr::io::path resolveOnWorkingDirectory (json name);
|
irr::io::path resolveOnWorkingDirectory (json name);
|
||||||
@ -33,9 +86,16 @@ namespace wp
|
|||||||
void prependEnvironment (irr::io::path path);
|
void prependEnvironment (irr::io::path path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* List of environment paths in which the resolver will look for
|
||||||
|
* files in when trying to resolve them
|
||||||
|
*/
|
||||||
std::vector<irr::io::path> m_environment;
|
std::vector<irr::io::path> m_environment;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Static resolver used trough most of the application
|
||||||
|
*/
|
||||||
extern fileResolver resolver;
|
extern fileResolver resolver;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,20 @@ namespace wp
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: CHECK EFFECT PASSES HERE SO WE CAN TAKE IN ACCOUNT THE EXTRA TEXTURES FOR SHADERS, ETC
|
// TODO: CHECK EFFECT PASSES HERE SO WE CAN TAKE IN ACCOUNT THE EXTRA TEXTURES FOR SHADERS, ETC
|
||||||
|
json::const_iterator effects = json_data.find ("effects");
|
||||||
|
|
||||||
|
if (effects != json_data.end ())
|
||||||
|
{
|
||||||
|
// TODO: SUPPORT MULTIPLE EFFECTS
|
||||||
|
json::const_iterator effectsItem = (*effects).begin ();
|
||||||
|
|
||||||
|
if (effectsItem != (*effects).end ())
|
||||||
|
{
|
||||||
|
// TODO: SUPPORT MULTIPLE PASSES FOR EFFECTS
|
||||||
|
json::const_iterator passes = (*effectsItem).find ("passes");
|
||||||
|
json::const_iterator file = (*effectsItem).find ("file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (origin_it != json_data.end ())
|
if (origin_it != json_data.end ())
|
||||||
{
|
{
|
||||||
|
@ -38,6 +38,11 @@ namespace wp
|
|||||||
{
|
{
|
||||||
this->m_title = name_it.value ();
|
this->m_title = name_it.value ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->m_type != "scene")
|
||||||
|
{
|
||||||
|
throw "Only scene wallpapers supported for now";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scene* project::getScene ()
|
scene* project::getScene ()
|
||||||
|
@ -24,10 +24,24 @@ namespace wp
|
|||||||
// begin with an space so it gets ignored properly on parse
|
// begin with an space so it gets ignored properly on parse
|
||||||
if (recursive == false)
|
if (recursive == false)
|
||||||
{
|
{
|
||||||
|
// compatibility layer for OpenGL shaders
|
||||||
this->m_content = "#version 120\n"
|
this->m_content = "#version 120\n"
|
||||||
"#define texSample2D texture2D\n"
|
"#define highp\n"
|
||||||
|
"#define mediump\n"
|
||||||
|
"#define lowp\n"
|
||||||
|
"#define mul(x, y) (y * x)\n"
|
||||||
"#define frac fract\n"
|
"#define frac fract\n"
|
||||||
"vec4 mul(vec4 x, mat4 y) { return x * y; }\n";
|
"#define CAST2(x) (vec2(x))\n"
|
||||||
|
"#define CAST3(x) (vec3(x))\n"
|
||||||
|
"#define CAST4(x) (vec4(x))\n"
|
||||||
|
"#define CAST3X3(x) (mat3(x))\n"
|
||||||
|
"#define saturate(x) (clamp(x, 0.0, 1.0))\n"
|
||||||
|
"#define texSample2D texture2D\n"
|
||||||
|
"#define texSample2DLod texture2DLod\n"
|
||||||
|
"#define atan2 atan\n"
|
||||||
|
"#define ddx dFdx\n"
|
||||||
|
"#define ddy(x) dFdy(-(x))\n"
|
||||||
|
"#define GLSL 1\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,11 @@ namespace wp
|
|||||||
class compiler
|
class compiler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Basic struct used to define all the shader variables
|
||||||
|
* the compiler will replace in pre-processing time
|
||||||
|
* to make sure the shaders compile under OpenGL
|
||||||
|
*/
|
||||||
struct VariableReplacement
|
struct VariableReplacement
|
||||||
{
|
{
|
||||||
const char* original;
|
const char* original;
|
||||||
@ -30,39 +35,164 @@ namespace wp
|
|||||||
int size;
|
int size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of shaders
|
||||||
|
*/
|
||||||
enum Type
|
enum Type
|
||||||
{
|
{
|
||||||
Type_Vertex = 0,
|
Type_Vertex = 0,
|
||||||
Type_Pixel = 1,
|
Type_Pixel = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of variables to replace when pre-process is performed
|
||||||
|
*/
|
||||||
static std::map<std::string, std::string> sVariableReplacement;
|
static std::map<std::string, std::string> sVariableReplacement;
|
||||||
|
/**
|
||||||
|
* Types of variables the pre-processor understands
|
||||||
|
*/
|
||||||
static std::vector<std::string> sTypes;
|
static std::vector<std::string> sTypes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compiler constructor, loads the given shader file and prepares
|
||||||
|
* the pre-processing and compilation of the shader, adding
|
||||||
|
* required definitions if needed
|
||||||
|
*
|
||||||
|
* @param file The file to load
|
||||||
|
* @param type The type of shader
|
||||||
|
* @param recursive Whether the compiler should add base definitions or not
|
||||||
|
*/
|
||||||
compiler (irr::io::path file, Type type, bool recursive = false);
|
compiler (irr::io::path file, Type type, bool recursive = false);
|
||||||
|
/**
|
||||||
|
* Performs the actual pre-compilation/pre-processing over the shader files
|
||||||
|
* This step is kinda big, replaces variables names on sVariableReplacement,
|
||||||
|
* ensures #include directives are correctly handled
|
||||||
|
* and takes care of attribute comments for the wallpaper engine specifics
|
||||||
|
*
|
||||||
|
* @return The shader contents ready to be used by OpenGL
|
||||||
|
*/
|
||||||
std::string precompile();
|
std::string precompile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/**
|
||||||
|
* Checks if there is "str" in the current position without advancing the
|
||||||
|
* iterator in use
|
||||||
|
*
|
||||||
|
* @param str The string to check for
|
||||||
|
* @param it The position to start checking at
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
bool peekString (std::string str, std::string::const_iterator& it);
|
bool peekString (std::string str, std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Checks for a semicolon as current character, advancing the iterator
|
||||||
|
* after finding it, otherwise returns an error
|
||||||
|
*
|
||||||
|
* @param it The position where to expect the semicolon
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
bool expectSemicolon (std::string::const_iterator& it);
|
bool expectSemicolon (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Ignores contiguous space characters in the string advancing the iterator
|
||||||
|
* until the first non-space character
|
||||||
|
*
|
||||||
|
* @param it The iterator to increase
|
||||||
|
*/
|
||||||
void ignoreSpaces (std::string::const_iterator& it);
|
void ignoreSpaces (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Ignores all characters until next line-fee (\n) advancing the interator
|
||||||
|
*
|
||||||
|
* @param it The iterator to increase
|
||||||
|
*/
|
||||||
void ignoreUpToNextLineFeed (std::string::const_iterator& it);
|
void ignoreUpToNextLineFeed (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Ignores all characters until a block comment end is found, advancing the iterator
|
||||||
|
*
|
||||||
|
* @param it The iterator to increase
|
||||||
|
*/
|
||||||
void ignoreUpToBlockCommentEnd (std::string::const_iterator& it);
|
void ignoreUpToBlockCommentEnd (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Parses the current position as a variable type, extracts it and compares it
|
||||||
|
* to the registered types in the pre-processor, returning it's name if valid
|
||||||
|
* increasing the iterator at the same time
|
||||||
|
*
|
||||||
|
* @param it The position to extract it from
|
||||||
|
*
|
||||||
|
* @return The type name
|
||||||
|
*/
|
||||||
std::string extractType (std::string::const_iterator& it);
|
std::string extractType (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Parses the current position as a variable name, extractig it's name and
|
||||||
|
* increasing the iterator as the name is extracted
|
||||||
|
*
|
||||||
|
* @param it The position to start extracting the variable name from
|
||||||
|
*
|
||||||
|
* @return The variable name
|
||||||
|
*/
|
||||||
std::string extractName (std::string::const_iterator& it);
|
std::string extractName (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Parses the current position as a quoted value, extracting it's value
|
||||||
|
* and increasing the iterator at the same time
|
||||||
|
*
|
||||||
|
* @param it The position to start extracting the value from
|
||||||
|
*
|
||||||
|
* @return The value
|
||||||
|
*/
|
||||||
std::string extractQuotedValue (std::string::const_iterator& it);
|
std::string extractQuotedValue (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* Tries to find the given shader file and compile it
|
||||||
|
*
|
||||||
|
* @param filename The shader's filename
|
||||||
|
*
|
||||||
|
* @return The compiled contents
|
||||||
|
*/
|
||||||
std::string lookupShaderFile (std::string filename);
|
std::string lookupShaderFile (std::string filename);
|
||||||
|
/**
|
||||||
|
* Searches for the given symbol in the replace table
|
||||||
|
*
|
||||||
|
* @param symbol The symbol to look for
|
||||||
|
*
|
||||||
|
* @return The symbol it should be replaced with
|
||||||
|
*/
|
||||||
std::string lookupReplaceSymbol (std::string symbol);
|
std::string lookupReplaceSymbol (std::string symbol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Whether the character in the current position is a character or not
|
||||||
|
*/
|
||||||
bool isChar (std::string::const_iterator& it);
|
bool isChar (std::string::const_iterator& it);
|
||||||
|
/**
|
||||||
|
* @return Whether the character in the current position is a number or not
|
||||||
|
*/
|
||||||
bool isNumeric (std::string::const_iterator& it);
|
bool isNumeric (std::string::const_iterator& it);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The shader file this instance is loading
|
||||||
|
*/
|
||||||
irr::io::path m_file;
|
irr::io::path m_file;
|
||||||
|
/**
|
||||||
|
* The original file content
|
||||||
|
*/
|
||||||
std::string m_content;
|
std::string m_content;
|
||||||
|
/**
|
||||||
|
* The final, compiled content ready to be used by OpenGL
|
||||||
|
*/
|
||||||
std::string m_compiledContent;
|
std::string m_compiledContent;
|
||||||
|
/**
|
||||||
|
* Whether there was any kind of error in the compilation or not
|
||||||
|
*/
|
||||||
bool m_error;
|
bool m_error;
|
||||||
|
/**
|
||||||
|
* Extra information about the error (if any)
|
||||||
|
*/
|
||||||
std::string m_errorInfo;
|
std::string m_errorInfo;
|
||||||
|
/**
|
||||||
|
* The type of shader
|
||||||
|
*/
|
||||||
Type m_type;
|
Type m_type;
|
||||||
|
/**
|
||||||
|
* The file resolver to be used by the compiler to load the files
|
||||||
|
*/
|
||||||
wp::fs::fileResolver m_resolver;
|
wp::fs::fileResolver m_resolver;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user