Pārlūkot izejas kodu

~ Current status of the project (basic shader support and shader precompilation steps)

Signed-off-by: Alexis Maiquez <almamu@almamu.com>
Alexis Maiquez 8 gadi atpakaļ
revīzija
ff59fcce41

+ 1 - 0
.idea/.name

@@ -0,0 +1 @@
+wallengine

+ 29 - 0
.idea/codeStyles/Project.xml

@@ -0,0 +1,29 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <Objective-C-extensions>
+      <file>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Import" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Macro" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Typedef" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Enum" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Constant" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Global" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Struct" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="FunctionPredecl" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Function" />
+      </file>
+      <class>
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Property" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="Synthesize" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InitMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="StaticMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="InstanceMethod" />
+        <option name="com.jetbrains.cidr.lang.util.OCDeclarationKind" value="DeallocMethod" />
+      </class>
+      <extensions>
+        <pair source="cpp" header="h" fileNamingConvention="NONE" />
+        <pair source="c" header="h" fileNamingConvention="NONE" />
+      </extensions>
+    </Objective-C-extensions>
+  </code_scheme>
+</component>

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/temp.iml" filepath="$PROJECT_DIR$/.idea/temp.iml" />
+    </modules>
+  </component>
+</project>

+ 2 - 0
.idea/temp.iml

@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module classpath="CMake" type="CPP_MODULE" version="4" />

+ 760 - 0
.idea/workspace.xml

@@ -0,0 +1,760 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CMakeRunConfigurationManager" shouldGenerate="true" shouldDeleteObsolete="true" buildAllGenerated="true">
+    <generated>
+      <config projectName="wallengine" targetName="wallengine" />
+      <config projectName="wallengine" targetName="temp" />
+    </generated>
+  </component>
+  <component name="CMakeSettings">
+    <configurations>
+      <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
+    </configurations>
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="18bb2960-e23f-4286-86eb-946e53957973" name="Default" comment="" />
+    <ignored path="$PROJECT_DIR$/cmake-build-debug/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="ExecutionTargetManager" SELECTED_TARGET="CMakeBuildProfile:Debug" />
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file leaf-file-name="BasicShaderLoader.cpp" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/BasicShaderLoader.cpp">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="475">
+              <caret line="115" column="56" lean-forward="false" selection-start-line="115" selection-start-column="56" selection-end-line="115" selection-end-column="56" />
+              <folding>
+                <element signature="e#0#21#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="main.cpp" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/main.cpp">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="396">
+              <caret line="33" column="46" lean-forward="true" selection-start-line="33" selection-start-column="46" selection-end-line="33" selection-end-column="46" />
+              <folding>
+                <element signature="e#0#19#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="CMakeLists.txt" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/CMakeLists.txt">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="192">
+              <caret line="16" column="111" lean-forward="false" selection-start-line="16" selection-start-column="111" selection-end-line="16" selection-end-column="111" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="waterripple_opengl.vert" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/res/shaders/effects/waterripple_opengl.vert">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="144">
+              <caret line="12" column="22" lean-forward="false" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="common.h" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/res/common.h">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="468">
+              <caret line="39" column="1" lean-forward="false" selection-start-line="39" selection-start-column="1" selection-end-line="39" selection-end-column="1" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="nier_test.cpp" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/nier_test.cpp">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="528">
+              <caret line="44" column="64" lean-forward="false" selection-start-line="44" selection-start-column="64" selection-end-line="44" selection-end-column="64" />
+              <folding>
+                <element signature="e#0#21#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="nier_test.h" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/nier_test.h">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="84">
+              <caret line="7" column="42" lean-forward="false" selection-start-line="7" selection-start-column="42" selection-end-line="7" selection-end-column="42" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="BasicShaderLoader.h" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/BasicShaderLoader.h">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="288">
+              <caret line="24" column="4" lean-forward="false" selection-start-line="24" selection-start-column="4" selection-end-line="24" selection-end-column="56" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>vo_keepas</find>
+      <find>Error code</find>
+      <find>XMapWindow</find>
+      <find>VOFLAG_W</find>
+      <find>_window3</find>
+      <find>_window</find>
+      <find>WinID</find>
+      <find>video_init</find>
+      <find>mDisplay =</find>
+      <find>GLSL</find>
+      <find>WGL_CONTEXT_MA</find>
+      <find>glui</find>
+      <find>Cannot create</find>
+      <find>glXCreate</find>
+      <find>glXCreateContex</find>
+      <find>Could not bind</find>
+      <find>glXCreateCon</find>
+      <find>context</find>
+      <find>GL_INVA</find>
+      <find>GLSL TEST</find>
+      <find>arb</find>
+      <find>include</find>
+      <find>if</find>
+      <find>version</find>
+      <find>define</find>
+      <find>main</find>
+      <find>#</find>
+      <find>preproces</find>
+      <find>m_token</find>
+    </findStrings>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/video.h" />
+        <option value="$PROJECT_DIR$/CMakeModules/FindIrrlicht.cmake" />
+        <option value="$PROJECT_DIR$/video.cpp" />
+        <option value="$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.cpp" />
+        <option value="$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp" />
+        <option value="$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp" />
+        <option value="$PROJECT_DIR$/res/shaders/effects/waterripple_opengl.frag" />
+        <option value="$PROJECT_DIR$/glsl/ast.h" />
+        <option value="$PROJECT_DIR$/glsl/writer.cpp" />
+        <option value="$PROJECT_DIR$/glsl/writer.h" />
+        <option value="$PROJECT_DIR$/glsl/lexemes.h" />
+        <option value="$PROJECT_DIR$/glsl/lexer.h" />
+        <option value="$PROJECT_DIR$/glsl/lexer.cpp" />
+        <option value="$PROJECT_DIR$/glsl/parser.h" />
+        <option value="$PROJECT_DIR$/glsl/parser.cpp" />
+        <option value="$PROJECT_DIR$/CMakeLists.txt" />
+        <option value="$PROJECT_DIR$/BasicShaderLoader.h" />
+        <option value="$PROJECT_DIR$/nier_test.h" />
+        <option value="$PROJECT_DIR$/common.h" />
+        <option value="$PROJECT_DIR$/main.cpp" />
+        <option value="$PROJECT_DIR$/res/common.h" />
+        <option value="$PROJECT_DIR$/res/shaders/effects/waterripple_opengl.vert" />
+        <option value="$PROJECT_DIR$/BasicShaderLoader.cpp" />
+        <option value="$PROJECT_DIR$/nier_test.cpp" />
+      </list>
+    </option>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="NodePackageJsonFileManager">
+    <packageJsonPaths />
+  </component>
+  <component name="OCFindUsagesOptions" text="true" ivars="false" properties="true" derivedClasses="false" />
+  <component name="ProjectFrameBounds">
+    <option name="x" value="1099" />
+    <option name="y" value="469" />
+    <option name="width" value="1882" />
+    <option name="height" value="1032" />
+  </component>
+  <component name="ProjectView">
+    <navigator currentView="ProjectPane" proportions="" version="1">
+      <flattenPackages />
+      <showMembers />
+      <showModules />
+      <showLibraryContents />
+      <hideEmptyPackages />
+      <abbreviatePackageNames />
+      <autoscrollToSource />
+      <autoscrollFromSource />
+      <sortByType />
+      <manualOrder />
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="wallengine" type="dad4c3:CidrFilesViewHelper$MyProjectTreeStructure$1" />
+              <item name="temp" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="wallengine" type="dad4c3:CidrFilesViewHelper$MyProjectTreeStructure$1" />
+              <item name="temp" type="462c0819:PsiDirectoryNode" />
+              <item name="res" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="wallengine" type="dad4c3:CidrFilesViewHelper$MyProjectTreeStructure$1" />
+              <item name="temp" type="462c0819:PsiDirectoryNode" />
+              <item name="res" type="462c0819:PsiDirectoryNode" />
+              <item name="shaders" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="wallengine" type="dad4c3:CidrFilesViewHelper$MyProjectTreeStructure$1" />
+              <item name="temp" type="462c0819:PsiDirectoryNode" />
+              <item name="res" type="462c0819:PsiDirectoryNode" />
+              <item name="shaders" type="462c0819:PsiDirectoryNode" />
+              <item name="effects" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+  </component>
+  <component name="RecentsManager">
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$/res/shaders/effects" />
+      <recent name="$PROJECT_DIR$/CMakeModules" />
+      <recent name="$PROJECT_DIR$" />
+    </key>
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="$PROJECT_DIR$" />
+      <recent name="$PROJECT_DIR$/res/materials/effects" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager">
+    <configuration name="Build All" type="CMakeRunConfiguration" factoryName="Application" PASS_PARENT_ENVS_2="true" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="wallengine" RUN_TARGET_NAME="wallengine" EXPLICIT_BUILD_TARGET_NAME="all">
+      <envs />
+    </configuration>
+  </component>
+  <component name="ShelveChangesManager" show_recycled="false">
+    <option name="remove_strategy" value="false" />
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="18bb2960-e23f-4286-86eb-946e53957973" name="Default" comment="" />
+      <created>1530110193995</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1530110193995</updated>
+      <workItem from="1530110195092" duration="9917000" />
+      <workItem from="1530613581741" duration="10035000" />
+      <workItem from="1530722346579" duration="9407000" />
+      <workItem from="1530742969892" duration="462000" />
+      <workItem from="1530736243286" duration="1301000" />
+      <workItem from="1530737554957" duration="12285000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="43407000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="1099" y="469" width="1882" height="1032" extended-state="0" />
+    <layout>
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.20365395" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32752994" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="CMake" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32861805" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="true" content_ui="tabs" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32861805" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33949944" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.24591948" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+    </layout>
+    <layout-to-restore>
+      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
+      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
+      <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32752994" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="CMake" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32861805" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" />
+      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
+      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="true" content_ui="tabs" />
+      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
+      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
+      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33949944" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
+      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
+      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.40849674" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
+      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
+      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32908705" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
+      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
+      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
+      <window_info id="Debug" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24591948" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
+    </layout-to-restore>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
+          <url>file://$PROJECT_DIR$/glsl/parser.cpp</url>
+          <line>310</line>
+          <option name="timeStamp" value="33" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
+          <url>file://$PROJECT_DIR$/glsl/parser.cpp</url>
+          <line>317</line>
+          <option name="timeStamp" value="39" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
+          <url>file://$PROJECT_DIR$/glsl/parser.cpp</url>
+          <line>641</line>
+          <option name="timeStamp" value="44" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="com.jetbrains.cidr.execution.debugger.OCBreakpointType">
+          <url>file://$PROJECT_DIR$/glsl/parser.cpp</url>
+          <line>309</line>
+          <option name="timeStamp" value="45" />
+        </line-breakpoint>
+      </breakpoints>
+      <option name="time" value="66" />
+    </breakpoint-manager>
+    <watches-manager />
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/video.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="90">
+          <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/video.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="12915">
+          <caret line="861" column="4" lean-forward="false" selection-start-line="861" selection-start-column="4" selection-end-line="861" selection-end-column="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/video.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="90">
+          <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/irrlicht/SIrrCreationParameters.h" />
+    <entry file="file://$PROJECT_DIR$/video.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="11448">
+          <caret line="954" column="4" lean-forward="false" selection-start-line="954" selection-start-column="4" selection-end-line="954" selection-end-column="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CMakeModules/FindIrrlicht.cmake">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="288">
+          <caret line="24" column="55" lean-forward="false" selection-start-line="24" selection-start-column="55" selection-end-line="24" selection-end-column="55" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/GL/gl.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-2136">
+          <caret line="659" column="8" lean-forward="false" selection-start-line="659" selection-start-column="8" selection-end-line="659" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="300">
+          <caret line="335" column="8" lean-forward="false" selection-start-line="335" selection-start-column="8" selection-end-line="335" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLSLMaterialRenderer.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-3733">
+          <caret line="345" column="36" lean-forward="false" selection-start-line="345" selection-start-column="36" selection-end-line="345" selection-end-column="36" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/glext.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="213">
+          <caret line="1372" column="21" lean-forward="false" selection-start-line="1372" selection-start-column="21" selection-end-line="1372" selection-end-column="21" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/glxext.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="186">
+          <caret line="595" column="56" lean-forward="false" selection-start-line="595" selection-start-column="23" selection-end-line="595" selection-end-column="56" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/irrlicht/irrlicht.h" />
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/include/IrrCompileConfig.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1248">
+          <caret line="104" column="8" lean-forward="false" selection-start-line="104" selection-start-column="8" selection-end-line="104" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLTexture.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3840">
+          <caret line="320" column="40" lean-forward="false" selection-start-line="320" selection-start-column="26" selection-end-line="320" selection-end-column="40" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/GL/glx.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="142">
+          <caret line="271" column="18" lean-forward="false" selection-start-line="271" selection-start-column="18" selection-end-line="271" selection-end-column="18" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLDriver.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1716">
+          <caret line="143" column="50" lean-forward="false" selection-start-line="143" selection-start-column="50" selection-end-line="143" selection-end-column="50" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="15096">
+          <caret line="1258" column="13" lean-forward="false" selection-start-line="1258" selection-start-column="10" selection-end-line="1258" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/COpenGLDriver.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="9048">
+          <caret line="754" column="16" lean-forward="false" selection-start-line="754" selection-start-column="16" selection-end-line="754" selection-end-column="16" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/irrlicht/source/Irrlicht/CIrrDeviceLinux.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="8712">
+          <caret line="726" column="33" lean-forward="false" selection-start-line="726" selection-start-column="33" selection-end-line="726" selection-end-column="33" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/res/shaders/effects/waterripple_opengl.frag">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/glsl-parser/lexemes.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="233">
+          <caret line="275" column="12" lean-forward="false" selection-start-line="275" selection-start-column="12" selection-end-line="275" selection-end-column="12" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/glsl-parser/lexer.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/glsl-parser/Makefile">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="276">
+          <caret line="23" column="27" lean-forward="false" selection-start-line="23" selection-start-column="27" selection-end-line="23" selection-end-column="27" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/glsl-parser/main.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-7044">
+          <caret line="31" column="47" lean-forward="false" selection-start-line="31" selection-start-column="47" selection-end-line="31" selection-end-column="47" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/util.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/ast.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-36">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../lib/glsl-parser-master/main.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="0">
+          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="587" selection-end-column="1" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/ast.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="174">
+          <caret line="34" column="2" lean-forward="false" selection-start-line="34" selection-start-column="2" selection-end-line="34" selection-end-column="2" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/writer.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="60">
+          <caret line="5" column="28" lean-forward="false" selection-start-line="5" selection-start-column="28" selection-end-line="5" selection-end-column="28" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/lexemes.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="168">
+          <caret line="14" column="18" lean-forward="false" selection-start-line="14" selection-start-column="18" selection-end-line="14" selection-end-column="18" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/writer.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="489">
+          <caret line="582" column="4" lean-forward="false" selection-start-line="582" selection-start-column="4" selection-end-line="582" selection-end-column="27" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/bits/alloc_traits.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="474" column="0" lean-forward="false" selection-start-line="474" selection-start-column="0" selection-end-line="474" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/util.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="261">
+          <caret line="24" column="0" lean-forward="false" selection-start-line="24" selection-start-column="0" selection-end-line="24" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/ext/new_allocator.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="78" column="0" lean-forward="false" selection-start-line="78" selection-start-column="0" selection-end-line="78" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/bits/allocator.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="130" column="0" lean-forward="false" selection-start-line="130" selection-start-column="0" selection-end-line="130" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/bits/stl_vector.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="394" column="0" lean-forward="false" selection-start-line="394" selection-start-column="0" selection-end-line="394" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/lexer.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="525">
+          <caret line="101" column="30" lean-forward="false" selection-start-line="101" selection-start-column="26" selection-end-line="101" selection-end-column="30" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/bits/vector.tcc">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1327">
+          <caret line="472" column="0" lean-forward="false" selection-start-line="472" selection-start-column="0" selection-end-line="472" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/parser.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="331">
+          <caret line="78" column="4" lean-forward="false" selection-start-line="78" selection-start-column="4" selection-end-line="78" selection-end-column="58" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/lexer.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-3">
+          <caret line="484" column="9" lean-forward="false" selection-start-line="484" selection-start-column="9" selection-end-line="484" selection-end-column="9" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/glsl/parser.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1855">
+          <caret line="753" column="22" lean-forward="true" selection-start-line="753" selection-start-column="22" selection-end-line="753" selection-end-column="22" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/CMakeLists.txt">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="192">
+          <caret line="16" column="111" lean-forward="false" selection-start-line="16" selection-start-column="111" selection-end-line="16" selection-end-column="111" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file:///usr/include/c++/8.1.1/bits/basic_string.tcc">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="223">
+          <caret line="218" column="0" lean-forward="false" selection-start-line="218" selection-start-column="0" selection-end-line="218" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/BasicShaderLoader.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="288">
+          <caret line="24" column="4" lean-forward="false" selection-start-line="24" selection-start-column="4" selection-end-line="24" selection-end-column="56" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/nier_test.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="84">
+          <caret line="7" column="42" lean-forward="false" selection-start-line="7" selection-start-column="42" selection-end-line="7" selection-end-column="42" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/common.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="96">
+          <caret line="8" column="0" lean-forward="false" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/res/common.h">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="468">
+          <caret line="39" column="1" lean-forward="false" selection-start-line="39" selection-start-column="1" selection-end-line="39" selection-end-column="1" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/main.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="396">
+          <caret line="33" column="46" lean-forward="true" selection-start-line="33" selection-start-column="46" selection-end-line="33" selection-end-column="46" />
+          <folding>
+            <element signature="e#0#19#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/BasicShaderLoader.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="475">
+          <caret line="115" column="56" lean-forward="false" selection-start-line="115" selection-start-column="56" selection-end-line="115" selection-end-column="56" />
+          <folding>
+            <element signature="e#0#21#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/res/shaders/effects/waterripple_opengl.vert">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="144">
+          <caret line="12" column="22" lean-forward="false" selection-start-line="12" selection-start-column="22" selection-end-line="12" selection-end-column="22" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/nier_test.cpp">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="528">
+          <caret line="44" column="64" lean-forward="false" selection-start-line="44" selection-start-column="64" selection-end-line="44" selection-end-column="64" />
+          <folding>
+            <element signature="e#0#21#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>

+ 147 - 0
BasicShaderLoader.cpp

@@ -0,0 +1,147 @@
+#include <irrlicht.h>
+#include <iostream>
+#include <fstream>
+#include <string>
+#include "BasicShaderLoader.h"
+#include "nier_test.h"
+#include "common.h"
+
+BasicShaderLoader::BasicShaderLoader (irr::io::path file, Type type)
+{
+    this->m_content =	"#version 120\n"
+                        "#define texSample2D texture2D\n"
+                        "#define frac fract\n";
+
+    std::ifstream _in (file.c_str ());
+    this->m_content.append (std::istreambuf_iterator<char> (_in), std::istreambuf_iterator<char> ());
+    this->m_type = type;
+}
+
+bool BasicShaderLoader::peekString(std::string str, std::string::const_iterator& it)
+{
+    std::string::const_iterator check = str.begin();
+    std::string::const_iterator cur = it + 1;
+
+    while (cur != this->m_content.end () && check != str.end ())
+    {
+        if (*cur != *check) return false;
+
+        cur ++; check ++;
+    }
+
+    if (check != str.end ())
+    {
+        return false;
+    }
+
+    it = cur;
+
+    return true;
+}
+
+void BasicShaderLoader::ignoreSpaces(std::string::const_iterator &it)
+{
+    while (it != this->m_content.end() && (*it == ' ' || *it == '\t')) it ++;
+}
+
+std::string BasicShaderLoader::extractQuotedValue(std::string::const_iterator& it)
+{
+    std::string::const_iterator cur = it;
+
+    if (*cur != '"')
+    {
+        m_error = true;
+        m_errorInfo = "Expected opening \" but got " + (*cur);
+        return "";
+    }
+
+    cur ++;
+
+    while (cur != this->m_content.end () && *cur != '\n' && *cur != '"') cur ++;
+
+    if (cur == this->m_content.end ())
+    {
+        m_error = true;
+        m_errorInfo = "Expected closing \" not found";
+        it = cur;
+        return "";
+    }
+
+    std::string filename = std::string (++it, cur);
+
+    it = cur;
+    return filename;
+}
+
+std::string BasicShaderLoader::lookupShaderFile (std::string filename)
+{
+    irr::io::path shaderTest = _example_base_folder; shaderTest += "/"; shaderTest += filename.c_str ();
+    irr::io::IFileSystem *fs = device->getFileSystem ();
+
+    // by default try to load from current folder
+    // we might want, in the future, to load things from different folders
+    // to provide standard functionality
+    if (fs->existFile (shaderTest) == false)
+    {
+        this->m_error = true;
+        this->m_errorInfo = "Cannot find file " + filename + " to include";
+        return "";
+    }
+
+    // open the file, read content and close it
+    irr::io::IReadFile* readFile = fs->createAndOpenFile (shaderTest);
+    char* buffer = (char*) malloc (readFile->getSize () + 1);
+    memset (buffer, 0, readFile->getSize() + 1);
+
+    readFile->read (buffer, readFile->getSize ());
+    readFile->drop ();
+
+    std::string output = buffer;
+
+    free (buffer);
+
+    return output;
+}
+
+std::string* BasicShaderLoader::precompile ()
+{
+    // parse the shader and find #includes and such things and translate them to the correct name
+    // also remove any #version definition to prevent errors
+    std::string::const_iterator it = this->m_content.begin ();
+
+    // search preprocessor macros and parse them
+    while (it != this->m_content.end () && this->m_error == false)
+    {
+        // TODO: on precompilation steps search for attributes and replace them
+        // TODO: with the correct opengl shader variable
+        if (*it == '#')
+        {
+            if (this->peekString ("include", it) == true)
+            {
+                std::string filename = "";
+
+                // ignore whitespaces
+                this->ignoreSpaces(it);
+                // extract value between quotes
+                filename = this->extractQuotedValue(it);
+
+                // try to find the file first
+                this->m_compiledContent += "// begin of included from file " + filename + "\r\n";
+                this->m_compiledContent += this->lookupShaderFile (filename);
+                this->m_compiledContent += "\r\n// end of included from file " + filename + "\r\n";
+            }
+            else
+            {
+                this->m_compiledContent += '#';
+            }
+        }
+        else
+        {
+            this->m_compiledContent += *it;
+        }
+
+        it ++;
+    }
+
+    return &this->m_compiledContent;
+}

+ 34 - 0
BasicShaderLoader.h

@@ -0,0 +1,34 @@
+#ifndef __BASIC_SHADER_LOADER_H__
+#define __BASIC_SHADER_LOADER_H__
+
+#include <iostream>
+
+/**
+ * A basic shader loader that adds basic function definitions to every loaded shader
+ */
+class BasicShaderLoader
+{
+public:
+    enum Type
+    {
+        Type_Vertex = 0,
+        Type_Pixel = 1,
+    };
+
+    BasicShaderLoader (irr::io::path file, Type type);
+    std::string* precompile ();
+
+private:
+    bool peekString (std::string str, std::string::const_iterator& it);
+    void ignoreSpaces (std::string::const_iterator& it);
+    std::string extractQuotedValue (std::string::const_iterator& it);
+    std::string lookupShaderFile (std::string filename);
+
+    std::string m_content;
+    std::string m_compiledContent;
+    bool m_error;
+    std::string m_errorInfo;
+    Type m_type;
+};
+
+#endif /* !__BASIC_SHADER_LOADER_H__ */

+ 19 - 0
CMakeLists.txt

@@ -0,0 +1,19 @@
+cmake_minimum_required(VERSION 3.0)
+project(wallengine)
+
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_FLAGS "-fpermissive")
+
+find_package(X11 REQUIRED)
+find_package(OpenGL REQUIRED)
+find_package(GLUT REQUIRED)
+find_package(ZLIB REQUIRED)
+
+add_library(irrlicht STATIC IMPORTED)
+set_property(TARGET irrlicht PROPERTY IMPORTED_LOCATION ../../lib/irrlicht/lib/Linux/libIrrlicht.a)
+
+include_directories(${X11_INCLUDE_DIR} "../lib/irrlicht/include")
+
+add_executable(wallengine main.cpp common.h nier_test.cpp BasicShaderLoader.h BasicShaderLoader.cpp nier_test.h)
+
+target_link_libraries(wallengine ${X11_LIBRARIES} ${X11_Xxf86vm_LIB} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${ZLIB_LIBRARIES} irrlicht)

+ 25 - 0
CMakeModules/FindIrrlicht.cmake

@@ -0,0 +1,25 @@
+FIND_PATH(IRRLICHT_INCLUDE_DIR irrlicht/irrlicht.h
+        PATHS $ENV{IRRDIR}/include
+        PATH_SUFFIXES irrlicht
+        )
+
+MESSAGE(STATUS "IRRLICHT_INCLUDE_DIR = ${IRRLICHT_INCLUDE_DIR}")
+
+FIND_LIBRARY(IRRLICHT_LIBRARY NAMES Irrlicht
+        PATHS $ENV{IRRDIR}/lib
+        )
+
+MESSAGE(STATUS "IRRLICHT_LIBRARY = ${IRRLICHT_LIBRARY}")
+
+# handle the QUIETLY and REQUIRED arguments and set IRRLICHT_FOUND to TRUE if
+# all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(IRRLICHT DEFAULT_MSG IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR)
+
+IF(IRRLICHT_FOUND)
+    SET(IRRLICHT_LIBRARIES ${IRRLICHT_LIBRARY})
+ELSE(IRRLICHT_FOUND)
+    SET(IRRLICHT_LIBRARIES)
+ENDIF(IRRLICHT_FOUND)
+
+MARK_AS_ADVANCED(IRRLICHT_LIBRARY IRRLICHT_INCLUDE_DIR)

+ 12 - 0
common.h

@@ -0,0 +1,12 @@
+//
+// Created by almamu on 27/06/18.
+//
+
+#ifndef TEMP_COMMON_H
+#define TEMP_COMMON_H
+
+extern int WinID;
+extern irr::video::IVideoDriver* driver;
+extern irr::IrrlichtDevice* device;
+
+#endif //TEMP_COMMON_H

+ 72 - 0
main.cpp

@@ -0,0 +1,72 @@
+#include <iostream>
+#include <irrlicht.h>
+#include <sstream>
+#include "nier_test.h"
+
+int WinID = 0;
+
+int game_test_main();
+
+int main(int argc, char* argv[])
+{
+    // parse the integer if it exists
+    if (argc >= 1)
+    {
+        std::stringstream ss;
+        ss << std::hex << argv[1];
+        ss >> WinID;
+    }
+
+    printf("Initializing X11 to %d\n", WinID);
+
+    return game_test_main ();
+}
+
+irr::IrrlichtDevice* device = nullptr;
+irr::video::IVideoDriver* driver = nullptr;
+irr::SIrrlichtCreationParameters _irr_params;
+
+int init_driver ()
+{
+    // prepare basic configuration for irrlicht
+    _irr_params.AntiAlias = 8;
+    _irr_params.Bits = 16;
+    // _irr_params.DeviceType = irr::EIDT_X11;
+    _irr_params.DriverType = irr::video::EDT_OPENGL;
+    _irr_params.Doublebuffer = true;
+    _irr_params.EventReceiver = nullptr;
+    _irr_params.Fullscreen = false;
+    _irr_params.HandleSRGB = false;
+    _irr_params.IgnoreInput = true;
+    _irr_params.Stencilbuffer = true;
+    _irr_params.UsePerformanceTimer = false;
+    _irr_params.Vsync = false;
+    _irr_params.WithAlphaChannel = false;
+    _irr_params.ZBufferBits = 24;
+    _irr_params.LoggingLevel = irr::ELL_DEBUG;
+    _irr_params.WindowId = reinterpret_cast<void*> (WinID);
+
+    device = irr::createDeviceEx (_irr_params);
+
+    if (device == nullptr)
+    {
+        return 1;
+    }
+
+    device->setWindowCaption (L"Test game");
+    driver = device->getVideoDriver();
+
+    return 0;
+}
+
+int game_test_main ()
+{
+    if (init_driver())
+    {
+        return 1;
+    }
+
+    nier_test ();
+
+    return 0;
+}

+ 242 - 0
nier_test.cpp

@@ -0,0 +1,242 @@
+#include <irrlicht.h>
+#include <cstdint>
+#include <iostream>
+
+#include "common.h"
+#include "BasicShaderLoader.h"
+
+irr::io::path _example_base_folder = "../res/";
+irr::f32 g_AnimationSpeed = 0.1f;
+irr::f32 g_Scale = 2.5f;
+irr::f32 g_ScrollSpeed = 0.0f;
+irr::f32 g_Direction = 0.0f;
+irr::f32 g_Strength = 0.07f;
+irr::f32 g_SpecularPower = 1.0f;
+irr::f32 g_SpecularStrength = 1.0f;
+irr::f32 g_SpecularColor [3] = {1.0f, 1.0f, 1.0f};
+irr::f32 g_Texture1Resolution [4] = {1.0f, 1.0f, 1.0f, 1.0f};
+irr::f32 g_Texture0 = 0;
+irr::f32 g_Texture1 = 1;
+irr::f32 g_Texture2 = 2;
+irr::f32 g_Time = 0;
+irr::core::vector3df _map_size = irr::core::vector3df (21, 11.5f, 16);
+
+class MyShaderCallback : public irr::video::IShaderConstantSetCallBack
+{
+    virtual void OnSetConstants (irr::video::IMaterialRendererServices* services, int32_t userData)
+    {
+        irr::video::IVideoDriver* driver = services->getVideoDriver ();
+
+        irr::core::matrix4 worldViewProj;
+        worldViewProj = driver->getTransform(irr::video::ETS_PROJECTION);
+        worldViewProj *= driver->getTransform(irr::video::ETS_VIEW);
+        worldViewProj *= driver->getTransform(irr::video::ETS_WORLD);
+
+        services->setVertexShaderConstant ("g_AnimationSpeed", &g_AnimationSpeed, 1);
+        services->setVertexShaderConstant ("g_Scale", &g_Scale, 1);
+        services->setVertexShaderConstant ("g_ScrollSpeed", &g_ScrollSpeed, 1);
+        services->setVertexShaderConstant ("g_Direction", &g_Direction, 1);
+        services->setVertexShaderConstant ("g_Time", &g_Time, 1);
+        services->setVertexShaderConstant ("g_ModelViewProjectionMatrix", worldViewProj.pointer(), 16);
+        services->setVertexShaderConstant ("g_Texture0Resolution", g_Texture1Resolution, 4);
+        services->setVertexShaderConstant ("g_Texture1Resolution", g_Texture1Resolution, 4);
+        services->setVertexShaderConstant ("g_Texture2Resolution", g_Texture1Resolution, 4);
+
+        // TODO: Support up to 7 materials (as wallpaper engine)
+        services->setPixelShaderConstant ("g_Strength", &g_Strength, 1);
+        services->setPixelShaderConstant ("g_SpecularPower", &g_SpecularPower, 1);
+        services->setPixelShaderConstant ("g_SpecularStrength", &g_SpecularStrength, 1);
+        services->setPixelShaderConstant ("g_SpecularColor", g_SpecularColor, 3);
+        services->setPixelShaderConstant ("g_Texture0", &g_Texture0, 1);
+        services->setPixelShaderConstant ("g_Texture1", &g_Texture1, 1);
+        services->setPixelShaderConstant ("g_Texture2", &g_Texture2, 1);
+    }
+};
+
+class QuadSceneNode : public irr::scene::ISceneNode
+{
+    irr::core::aabbox3d <irr::f32> m_box;
+    irr::video::S3DVertex m_vertices [4];
+    irr::video::SMaterial m_material;
+
+public:
+    QuadSceneNode (irr::scene::ISceneNode* parent, irr::scene::ISceneManager* sceneManager, int32_t id)
+            : irr::scene::ISceneNode (parent, sceneManager, id)
+    {
+        m_material.Wireframe = false;
+        m_material.Lighting = false;
+
+        m_vertices[0].Pos = irr::core::vector3df ( _map_size.X,  _map_size.Y, 0.0f); // bottom right
+        m_vertices[1].Pos = irr::core::vector3df ( _map_size.X, -_map_size.Y, 0.0f); // top right
+        m_vertices[2].Pos = irr::core::vector3df (-_map_size.X, -_map_size.Y, 0.0f); // top left
+        m_vertices[3].Pos = irr::core::vector3df (-_map_size.X,  _map_size.Y, 0.0f); // bottom left
+
+        m_vertices[0].TCoords = irr::core::vector2df (1.0f, 0.0f);
+        m_vertices[1].TCoords = irr::core::vector2df (1.0f, 1.0f);
+        m_vertices[2].TCoords = irr::core::vector2df (0.0f, 1.0f);
+        m_vertices[3].TCoords = irr::core::vector2df (0.0f, 0.0f);
+
+        m_vertices[0].Color = irr::video::SColor (255, 255, 255, 255);
+        m_vertices[1].Color = irr::video::SColor (255, 255, 255, 255);
+        m_vertices[2].Color = irr::video::SColor (255, 255, 255, 255);
+        m_vertices[3].Color = irr::video::SColor (255, 255, 255, 255);
+
+        m_box.reset (m_vertices[0].Pos);
+        for (int32_t i = 1; i < 4; i ++)
+        {
+            m_box.addInternalPoint (m_vertices [i].Pos);
+        }
+    }
+
+    virtual void OnRegisterSceneNode ()
+    {
+        if (IsVisible)
+            SceneManager->registerNodeForRendering (this);
+
+        ISceneNode::OnRegisterSceneNode ();
+    }
+
+    virtual void render ()
+    {
+        uint16_t indices[] = {
+                0, 1, 2, 3
+        };
+
+        irr::video::IVideoDriver* driver = SceneManager->getVideoDriver ();
+
+        driver->setMaterial (m_material);
+        driver->drawVertexPrimitiveList (m_vertices, 4, indices, 1, irr::video::EVT_STANDARD, irr::scene::EPT_QUADS, irr::video::EIT_16BIT);
+    }
+
+    virtual const irr::core::aabbox3d <irr::f32>& getBoundingBox () const
+    {
+        return m_box;
+    }
+
+    virtual uint32_t getMaterialCount () const
+    {
+        return 1;
+    }
+
+    virtual irr::video::SMaterial& getMaterial (uint32_t i)
+    {
+        return m_material;
+    }
+};
+
+int nier_test ()
+{
+    irr::io::path _water_example = _example_base_folder; _water_example += "materials/water-intact.png";
+    irr::io::path _mud_example = _example_base_folder; _mud_example += "materials/plant-on-water.png";
+    irr::io::path _background_example = _example_base_folder; _background_example += "materials/top-part.png";
+    irr::io::path _waterripple_normal = _example_base_folder; _waterripple_normal += "materials/effects/waterripplenormal.png";
+    irr::io::path _waterripple_frag_shader = _example_base_folder; _waterripple_frag_shader += "shaders/effects/waterripple_opengl.frag";
+    irr::io::path _waterripple_vert_shader = _example_base_folder; _waterripple_vert_shader += "shaders/effects/waterripple_opengl.vert";
+    irr::io::path _white = _example_base_folder; _white += "materials/white.png";
+
+    /*irr::video::E_DRIVER_TYPE driverType = irr::video::E_DRIVER_TYPE::EDT_OPENGL;
+    device = irr::createDevice (driverType, irr::core::dimension2d<uint32_t>(1280, 720));
+
+    device->setWindowCaption (L"Wallpaper engine simulation v0.1");
+    driver = device->getVideoDriver ();*/
+
+    // check for ps and vs support
+    if (driver->queryFeature (irr::video::EVDF_PIXEL_SHADER_1_1) == false && driver->queryFeature (irr::video::EVDF_ARB_FRAGMENT_PROGRAM_1) == false)
+    {
+        device->getLogger ()->log ("WARNING: Pixel shaders disabled because of missing driver/hardware support");
+        _waterripple_frag_shader = "";
+    }
+
+    if (driver->queryFeature (irr::video::EVDF_VERTEX_SHADER_1_1) == false && driver->queryFeature (irr::video::EVDF_ARB_VERTEX_PROGRAM_1) == false)
+    {
+        device->getLogger ()->log ("WARNING: Vertex shaders disabled because of missing driver/hardware support");
+        _waterripple_vert_shader = "";
+    }
+
+    irr::video::IGPUProgrammingServices* gpuProgrammingServices = driver->getGPUProgrammingServices ();
+
+    int32_t materialType1 = 0;
+
+    if (gpuProgrammingServices)
+    {
+        MyShaderCallback* shader = new MyShaderCallback ();
+
+        BasicShaderLoader _vert(_waterripple_vert_shader, BasicShaderLoader::Type::Type_Vertex);
+        BasicShaderLoader _frag(_waterripple_frag_shader, BasicShaderLoader::Type::Type_Pixel);
+
+        materialType1 = gpuProgrammingServices->addHighLevelShaderMaterial(
+                _vert.precompile ()->c_str (), "vertexMain", irr::video::EVST_VS_2_0,
+                _frag.precompile ()->c_str (), "pixelMain", irr::video::EPST_PS_2_0,
+                shader, irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL, 0, irr::video::EGSL_DEFAULT
+        );
+
+        shader->drop ();
+    }
+
+    // load some basic textures
+    irr::video::ITexture*	waterTexture = driver->getTexture (_water_example.c_str ());
+    irr::video::ITexture*	mudTexture = driver->getTexture (_mud_example.c_str ());
+    irr::video::ITexture*	backgroundExample = driver->getTexture (_background_example.c_str ());
+    irr::video::ITexture*	waterRippleNormalTexture = driver->getTexture (_waterripple_normal.c_str ());
+    irr::video::ITexture*	whiteTexture = driver->getTexture (_white.c_str ());
+
+    // get scene manager
+    irr::scene::ISceneManager* sceneManager = device->getSceneManager ();
+
+    sceneManager->addCameraSceneNode (0, irr::core::vector3df (0.0f, 0.0f, -_map_size.Z), irr::core::vector3df (0.0f, 0.0f, _map_size.Z));
+
+    QuadSceneNode* backgroundNode = new QuadSceneNode (sceneManager->getRootSceneNode (), sceneManager, 666);
+    QuadSceneNode* waterNode = new QuadSceneNode (sceneManager->getRootSceneNode (), sceneManager, 667);
+    QuadSceneNode* mudNode = new QuadSceneNode (sceneManager->getRootSceneNode (), sceneManager, 668);
+
+    backgroundNode->getMaterial (0).setTexture (0, backgroundExample);
+    backgroundNode->setMaterialType (irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);
+
+    mudNode->getMaterial (0).setTexture (0, mudTexture);
+    mudNode->setMaterialType (irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);
+
+    waterNode->setMaterialFlag(irr::video::EMF_LIGHTING, false);
+    waterNode->setMaterialFlag(irr::video::EMF_BLEND_OPERATION, true);
+
+    waterNode->getMaterial (0).setTexture (0, waterTexture);
+    waterNode->getMaterial (0).setTexture (1, waterRippleNormalTexture);
+    waterNode->getMaterial (0).setTexture (2, whiteTexture);
+    waterNode->setMaterialType ( (irr::video::E_MATERIAL_TYPE) materialType1);
+
+    irr::core::matrix4 identity; identity.makeIdentity ();
+    irr::core::matrix4 orthoProjection; orthoProjection.buildProjectionMatrixOrthoLH (1.0f, 1.0f, 0.0f, 1.0f);
+
+    driver->setTransform (irr::video::ETS_PROJECTION, orthoProjection);
+    driver->setTransform (irr::video::ETS_VIEW, identity);
+    driver->setTransform (irr::video::ETS_WORLD, identity);
+
+    int32_t lastTime = 0;
+    int32_t minimumTime = 1000 / 90;
+    int32_t currentTime = 0;
+
+    while (device->run () && driver)
+    {
+        // if (device->isWindowActive ())
+        {
+            currentTime = device->getTimer ()->getTime ();
+            g_Time = currentTime / 1000.0f;
+
+            if (currentTime - lastTime > minimumTime)
+            {
+                driver->beginScene (true, true, irr::video::SColor(0, 0, 0, 0));
+                sceneManager->drawAll ();
+                driver->endScene ();
+
+                lastTime = currentTime;
+            }
+            else
+            {
+                device->sleep (1, false);
+            }
+
+            // printf ("FPS: %d\n", driver->getFPS ());
+        }
+    }
+
+    return 0;
+}

+ 12 - 0
nier_test.h

@@ -0,0 +1,12 @@
+//
+// Created by almamu on 4/07/18.
+//
+
+#ifndef WALLENGINE_NIER_TEST_H
+#define WALLENGINE_NIER_TEST_H
+
+extern irr::io::path _example_base_folder;
+
+int nier_test ();
+
+#endif //WALLENGINE_NIER_TEST_H

BIN
res/2b.png


+ 40 - 0
res/common.h

@@ -0,0 +1,40 @@
+#define M_PI 3.14159265359
+#define M_PI_HALF 1.57079632679
+#define M_PI_2 6.28318530718
+
+#define SQRT_2 1.41421356237
+#define SQRT_3 1.73205080756
+
+///////////////////////////////////////////
+// Color conversion
+///////////////////////////////////////////
+vec3 hsv2rgb(vec3 c)
+{
+    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
+    vec3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
+    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
+}
+
+vec3 rgb2hsv(vec3 RGB)
+{
+    vec4 P = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0);
+    vec4 Q = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx);
+    float C = Q.x - min(Q.w, Q.y);
+    float H = abs((Q.w - Q.y) / (6 * C + 1e-10) + Q.z);
+
+    vec3 HCV = vec3(H, C, Q.x);
+    float S = HCV.y / (HCV.z + 1e-10);
+    return vec3(HCV.x, S, HCV.z);
+}
+
+vec2 rotateVec2(vec2 v, float r)
+{
+    vec2 cs = vec2(cos(r), sin(r));
+    return vec2(v.x * cs.x - v.y * cs.y,
+                v.x * cs.y + v.y * cs.x);
+}
+
+float greyscale(vec3 color)
+{
+    return dot(color, vec3(0.11, 0.59, 0.3));
+}

BIN
res/materials/bIW3uM3.jpg


BIN
res/materials/effects/waterripplenormal.png


BIN
res/materials/plant-on-water.png


BIN
res/materials/top-part.png


BIN
res/materials/water-intact.png


BIN
res/materials/white.png


+ 39 - 0
res/shaders/effects/waterripple_opengl.frag

@@ -0,0 +1,39 @@
+
+// [COMBO_OFF] {"material":"ui_editor_properties_specular","combo":"SPECULAR","type":"options","default":0}
+
+varying vec4 v_TexCoord;
+varying vec2 v_Scroll;
+
+uniform sampler2D g_Texture0; // {"material":"ui_editor_properties_framebuffer","hidden":true}
+uniform sampler2D g_Texture1; // {"material":"ui_editor_properties_water_normal"}
+uniform sampler2D g_Texture2; // {"material":"ui_editor_properties_opacity_mask","mode":"opacitymask","default":"util/white"}
+
+uniform float g_Strength; // {"material":"ui_editor_properties_ripple_strength","default":0.1,"range":[0,1]}
+uniform float g_SpecularPower; // {"material":"ui_editor_properties_ripple_specular_power","default":1.0,"range":[0,100]}
+uniform float g_SpecularStrength; // {"material":"ui_editor_properties_ripple_specular_strength","default":1.0,"range":[0,10]}
+uniform vec3 g_SpecularColor; // {"material":"ui_editor_properties_ripple_specular_color","default":"1 1 1","type":"color"}
+
+varying vec4 v_TexCoordRipple;
+
+void main() {
+	vec2 texCoord = v_TexCoord.xy;
+	
+	float mask = texSample2D(g_Texture2, v_TexCoord.zw).r;
+	
+	vec3 n1 = texSample2D(g_Texture1, v_TexCoordRipple.xy).xyz * 2 - 1;
+	vec3 n2 = texSample2D(g_Texture1, v_TexCoordRipple.zw).xyz * 2 - 1;
+	vec3 normal = normalize(vec3(n1.xy + n2.xy, n1.z));
+	
+	texCoord.xy += normal.xy * g_Strength * g_Strength * mask;
+	
+	gl_FragColor = texSample2D(g_Texture0, texCoord);
+	
+#if SPECULAR == 1
+	vec2 direction = vec2(0.5, 0.0) - v_TexCoord.xy;
+	direction = normalize(direction);
+	float specular = max(0.0, dot(normal.xy, direction)) * max(0.0, dot(direction, vec2(0.0, -1.0)));
+	
+	specular = pow(specular, g_SpecularPower) * g_SpecularStrength;
+	gl_FragColor.rgb += specular * g_SpecularColor * gl_FragColor.a;
+#endif
+}

+ 42 - 0
res/shaders/effects/waterripple_opengl.vert

@@ -0,0 +1,42 @@
+#include "common.h"
+
+uniform mat4 g_ModelViewProjectionMatrix;
+uniform float g_Time;
+uniform vec4 g_Texture0Resolution;
+uniform vec4 g_Texture2Resolution;
+
+uniform float g_AnimationSpeed; // {"material":"ui_editor_properties_animation_speed","default":0.15,"range":[0,0.5]}
+uniform float g_Scale; // {"material":"ui_editor_properties_ripple_scale","default":1,"range":[0,10]}
+uniform float g_ScrollSpeed; // {"material":"ui_editor_properties_scroll_speed","default":0,"range":[0,0.5]}
+uniform float g_Direction; // {"material":"ui_editor_properties_scroll_direction","default":0,"range":[0,6.28]}
+
+// attribute vec3 a_Position; // replaced by gl_Vertex
+// attribute vec2 a_TexCoord; // replaced by gl_MultiTexCoord0
+
+varying vec4 v_TexCoord;
+varying vec4 v_TexCoordRipple;
+
+void main() {
+	// gl_Position = mul(vec4(a_Position, 1.0), g_ModelViewProjectionMatrix);
+	gl_Position = g_ModelViewProjectionMatrix * gl_Vertex;
+	v_TexCoord.xy = gl_MultiTexCoord0.xy;
+	// v_TexCoord.xy = a_TexCoord;
+	
+	float piFrac = 0.78539816339744830961566084581988 * 0.5;
+	float pi = 3.141;
+	
+	vec2 coordsRotated = v_TexCoord.xy;
+	vec2 coordsRotated2 = v_TexCoord.xy * 1.333;
+	
+	vec2 scroll = rotateVec2(vec2(0, -1), g_Direction) * g_ScrollSpeed * g_ScrollSpeed * g_Time;
+	
+	v_TexCoordRipple.xy = coordsRotated + g_Time * g_AnimationSpeed * g_AnimationSpeed + scroll;
+	v_TexCoordRipple.zw = coordsRotated2 - g_Time * g_AnimationSpeed * g_AnimationSpeed + scroll;
+	v_TexCoordRipple *= g_Scale;
+
+	float rippleTextureAdjustment = (g_Texture0Resolution.x / g_Texture0Resolution.y);
+	v_TexCoordRipple.xz *= rippleTextureAdjustment;
+	
+	v_TexCoord.zw = vec2(v_TexCoord.x * g_Texture2Resolution.z / g_Texture2Resolution.x,
+						v_TexCoord.y * g_Texture2Resolution.w / g_Texture2Resolution.y);
+}