From 07131c8693674b96b270c165e6333afcbb9f4b4c Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Wed, 12 Oct 2022 19:42:12 -0500 Subject: [PATCH] Initial commit --- .vscode/launch.json | 31 + .vscode/settings.json | 64 + .vscode/tasks.json | 18 + Block.cpp | 8 + Block.h | 14 + C++/scripts/build.sh | 7 + C++/scripts/commit.sh | 20 + C++/scripts/filelist | 6 + C++/scripts/lines.sh | 14 + C++/scripts/md5 | 6 + C++/scripts/release.sh | 7 + C++/scripts/temp | 0 C++/scripts/web.sh | 18 + C++ProjectTemplate | Bin 0 -> 664056 bytes C++ProjectTemplate.html | 75 + C++ProjectTemplate.js | 1 + C++ProjectTemplate.wasm | Bin 0 -> 333469 bytes Map.cpp | 6 + Map.h | 10 + Player.cpp | 6 + Player.h | 10 + README.md | 33 + a.out | Bin 0 -> 543576 bytes art/car.png | Bin 0 -> 36508 bytes art/grass.png | Bin 0 -> 541 bytes art/hills.png | Bin 0 -> 21821 bytes art/road.png | Bin 0 -> 8452 bytes art/start.png | Bin 0 -> 3141 bytes buildtemplate.html | 75 + co2.png | Bin 0 -> 5408 bytes dependentClasses.zip | Bin 0 -> 1290 bytes diff | 14 + dirtblock.png | Bin 0 -> 35629 bytes main.cpp | 1135 +++++++ pixelGameEngine.h | 6222 ++++++++++++++++++++++++++++++++++++++ sig | 9 + utils/.coauthors | 1 + utils/.updateDirectories | 5 + utils/define.sh | 26 + utils/filelist | 5 + utils/main.sh | 28 + utils/md5 | 4 + utils/search.sh | 103 + 43 files changed, 7981 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 Block.cpp create mode 100644 Block.h create mode 100755 C++/scripts/build.sh create mode 100755 C++/scripts/commit.sh create mode 100644 C++/scripts/filelist create mode 100755 C++/scripts/lines.sh create mode 100644 C++/scripts/md5 create mode 100755 C++/scripts/release.sh create mode 100644 C++/scripts/temp create mode 100755 C++/scripts/web.sh create mode 100755 C++ProjectTemplate create mode 100644 C++ProjectTemplate.html create mode 100644 C++ProjectTemplate.js create mode 100755 C++ProjectTemplate.wasm create mode 100644 Map.cpp create mode 100644 Map.h create mode 100644 Player.cpp create mode 100644 Player.h create mode 100644 README.md create mode 100755 a.out create mode 100644 art/car.png create mode 100644 art/grass.png create mode 100644 art/hills.png create mode 100644 art/road.png create mode 100644 art/start.png create mode 100644 buildtemplate.html create mode 100644 co2.png create mode 100644 dependentClasses.zip create mode 100644 diff create mode 100644 dirtblock.png create mode 100644 main.cpp create mode 100644 pixelGameEngine.h create mode 100755 sig create mode 100644 utils/.coauthors create mode 100644 utils/.updateDirectories create mode 100755 utils/define.sh create mode 100644 utils/filelist create mode 100644 utils/main.sh create mode 100644 utils/md5 create mode 100644 utils/search.sh diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4c47955 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,31 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [{ + "preLaunchTask": "Build", + "name": "(gdb) Launch", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/a.out", + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + } + ] + }] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2c4cf1d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,64 @@ +{ + "files.associations": { + "map1": "plaintext", + "iostream": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "random": "cpp", + "ratio": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "strstream": "cpp" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..d389175 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,18 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build", + "command": "g++ *.cpp -std=c++17 -lX11 -lGL -lpthread -lpng -lstdc++fs -lpulse -lpulse-simple -o a.out", + "type": "shell", + "args": [], + "problemMatcher": [ + "$tsc" + ], + "presentation": { + "reveal": "always" + }, + "group": "build" + } + ] +} \ No newline at end of file diff --git a/Block.cpp b/Block.cpp new file mode 100644 index 0000000..5f224f0 --- /dev/null +++ b/Block.cpp @@ -0,0 +1,8 @@ +#include "Block.h" + +Block::Block(int x, int y, int R, int B, int G) +{ + X = x; + Y = y; + color = std::make_tuple(R, G, B); +} \ No newline at end of file diff --git a/Block.h b/Block.h new file mode 100644 index 0000000..2f4a7fd --- /dev/null +++ b/Block.h @@ -0,0 +1,14 @@ +#pragma once +#include + +class Block +{ +public: + Block(){}; + Block(int x, int y, int R, int B, int G); + void display(float CameraX, float CameraY, float Zoom); +private: + int X; + int Y; + std::tuple color; +}; \ No newline at end of file diff --git a/C++/scripts/build.sh b/C++/scripts/build.sh new file mode 100755 index 0000000..0656a8a --- /dev/null +++ b/C++/scripts/build.sh @@ -0,0 +1,7 @@ +#Compiles the entire program then runs it, producing an executable. +#C++ +printf "Running program...\n\n\n" +if g++ $(find . -type f -name "*.cpp") ${CUSTOM_PARAMS} -o ${PROJECT_NAME}; then + ./${PROJECT_NAME} "$@" +fi +printf "\n\n" diff --git a/C++/scripts/commit.sh b/C++/scripts/commit.sh new file mode 100755 index 0000000..2693b46 --- /dev/null +++ b/C++/scripts/commit.sh @@ -0,0 +1,20 @@ +#Adds a commit message and pushes project to github repository. +#C++ +COMMIT_MESSAGE="$*" +FIRST_LINE=true +while IFS= read -r line +do +if [ "$FIRST_LINE" = true ]; then + COMMIT_MESSAGE+=" + +Co-authored-by: $line" +FIRST_LINE=false +else + COMMIT_MESSAGE+=" +Co-authored-by: $line" +fi +done < utils/.coauthors +git add -u +git add * +git commit -m "$COMMIT_MESSAGE" +git push \ No newline at end of file diff --git a/C++/scripts/filelist b/C++/scripts/filelist new file mode 100644 index 0000000..ca9afe2 --- /dev/null +++ b/C++/scripts/filelist @@ -0,0 +1,6 @@ +build.sh +commit.sh +lines.sh +release.sh +temp +web.sh diff --git a/C++/scripts/lines.sh b/C++/scripts/lines.sh new file mode 100755 index 0000000..90e6d10 --- /dev/null +++ b/C++/scripts/lines.sh @@ -0,0 +1,14 @@ +#Returns the line counts of your project. +#C++ +shopt -s extglob +ls -1 @(*.h|*.cpp) > temp +while read a; do + if [ "$a" != "pixelGameEngine.h" ] && [ "$a" != "soundwaveEngine.h" ] && [ "$a" != "splash.h" ]; + then + echo -e "$a\n" >> temp2 + fi +done < temp +wc -l $(cat temp2) + +rm temp +rm temp2 \ No newline at end of file diff --git a/C++/scripts/md5 b/C++/scripts/md5 new file mode 100644 index 0000000..b57c2c4 --- /dev/null +++ b/C++/scripts/md5 @@ -0,0 +1,6 @@ +build.sh:530634457ea9041267c05d4ced95eee1 - +commit.sh:d03a46e721060c22ccb146e19d27e70a - +lines.sh:3b907786f7fc9204025993016c9080de - +release.sh:a54e2002be80814cc1293a11dff4d116 - +temp:d41d8cd98f00b204e9800998ecf8427e - +web.sh:3dcc2fe7e036359eedd257a864e9a1e1 - diff --git a/C++/scripts/release.sh b/C++/scripts/release.sh new file mode 100755 index 0000000..b1620e8 --- /dev/null +++ b/C++/scripts/release.sh @@ -0,0 +1,7 @@ +#Creates a release build that focuses on high runtime performance. +#C++ +printf "Running program...\n\n\n" +if g++ $(find . -type f -name "*.cpp") ${CUSTOM_PARAMS} -O3 -s -DNDEBUG -o ${PROJECT_NAME}; then + ./${PROJECT_NAME} "$@" +fi +printf "\n\n" diff --git a/C++/scripts/temp b/C++/scripts/temp new file mode 100644 index 0000000..e69de29 diff --git a/C++/scripts/web.sh b/C++/scripts/web.sh new file mode 100755 index 0000000..2e1a1f3 --- /dev/null +++ b/C++/scripts/web.sh @@ -0,0 +1,18 @@ +#Compiles emscripten instance of this project for the web. +#C++ +if [ -d "assets" ]; then + em++ -std=c++17 -O2 -s ALLOW_MEMORY_GROWTH=1 -s MAX_WEBGL_VERSION=2 -s MIN_WEBGL_VERSION=2 -s USE_SDL_MIXER=2 -s USE_LIBPNG=1 $(find . -type f -name "*.cpp") -o ${PROJECT_NAME}.html -I pixelGameEngine.h --preload-file ./assets +else + em++ -std=c++17 -O2 -s ALLOW_MEMORY_GROWTH=1 -s MAX_WEBGL_VERSION=2 -s MIN_WEBGL_VERSION=2 -s USE_SDL_MIXER=2 -s USE_LIBPNG=1 $(find . -type f -name "*.cpp") -o ${PROJECT_NAME}.html -I pixelGameEngine.h +fi + +cp buildtemplate.html ${PROJECT_NAME}.html +sed -i "s/_REPLACEME_/$PROJECT_NAME.js/" ${PROJECT_NAME}.html + +if [ "$1" == "headless" ]; then + echo "Running as headless web server" + emrun --no_browser ${PROJECT_NAME}.html +else + emrun --serve_after_close ${PROJECT_NAME}.html +fi + diff --git a/C++ProjectTemplate b/C++ProjectTemplate new file mode 100755 index 0000000000000000000000000000000000000000..02449492065bc4d0c68049d9247c8ae228d05627 GIT binary patch literal 664056 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°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

C7k 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
Mkl>NQ0PNmUdZ@1=39Ht|2(j!b!bZ@Sp- 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 YS&GN}6Z)GUf9KE3Kb{pA6yNUse?Sd|%m4rY literal 0 HcmV?d00001 diff --git a/C++ProjectTemplate.html b/C++ProjectTemplate.html new file mode 100644 index 0000000..de51b65 --- /dev/null +++ b/C++ProjectTemplate.html @@ -0,0 +1,75 @@ + + + + + + + + Emscripten-Generated Code + + + + + + + + + + diff --git a/C++ProjectTemplate.js b/C++ProjectTemplate.js new file mode 100644 index 0000000..5a678da --- /dev/null +++ b/C++ProjectTemplate.js @@ -0,0 +1 @@ +var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var POINTER_SIZE=4;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="C++ProjectTemplate.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["__indirect_function_table"];addOnInit(Module["asm"]["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={42608:()=>{window.onunload=Module._olc_OnPageUnload},42652:($0,$1)=>{Module._olc_EmscriptenShellCss="width: 100%; height: 70vh; margin-left: auto; margin-right: auto;";Module._olc_WindowAspectRatio=$0/$1;Module.canvas.parentNode.addEventListener("resize",function(e){if(e.defaultPrevented){e.stopPropagation();return}var viewWidth=e.detail.width;var viewHeight=e.detail.width/Module._olc_WindowAspectRatio;if(viewHeight>e.detail.height){viewHeight=e.detail.height;viewWidth=e.detail.height*Module._olc_WindowAspectRatio}if(Module.canvas.parentNode.className=="emscripten_border")Module.canvas.parentNode.style.cssText=Module._olc_EmscriptenShellCss+" width: "+viewWidth.toString()+"px; height: "+viewHeight.toString()+"px;";Module.canvas.setAttribute("width",viewWidth);Module.canvas.setAttribute("height",viewHeight);if(document.fullscreenElement!=null){var top=(e.detail.height-viewHeight)/2;var left=(e.detail.width-viewWidth)/2;Module.canvas.style.position="fixed";Module.canvas.style.top=top.toString()+"px";Module.canvas.style.left=left.toString()+"px";Module.canvas.style.width="";Module.canvas.style.height=""}Module._olc_PGE_UpdateWindowSize(viewWidth,viewHeight);Module.canvas.focus();e.stopPropagation()});Module._olc_ResizeCanvas=function(){setTimeout(function(){if(Module.canvas.parentNode.className=="emscripten_border")Module.canvas.parentNode.style.cssText=Module._olc_EmscriptenShellCss;Module.canvas.style.cssText="width: 100%; height: 100%; outline: none;";var resizeEvent=new CustomEvent("resize",{detail:{width:Module.canvas.clientWidth,height:Module.canvas.clientHeight},bubbles:true,cancelable:true});Module.canvas.dispatchEvent(resizeEvent)},50)};document.body.style.cssText+=" overscroll-behavior-y: contain;";if(Module.canvas.parentNode.className=="emscripten_border"){document.body.style.margin="0";Module.canvas.parentNode.style.cssText=Module._olc_EmscriptenShellCss}Module._olc_ResizeCanvas();var resizeObserver=new ResizeObserver(function(entries){Module._olc_ResizeCanvas()}).observe(Module.canvas.parentNode);var mutationObserver=new MutationObserver(function(mutationsList,observer){for(var i=0;i0){callbacks.shift()(Module)}}function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function ___cxa_allocate_exception(size){return _malloc(size+24)+24}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;tempI64=[Math.floor(stat.atime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.atime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAP32[buf+64>>2]=0;tempI64=[Math.floor(stat.mtime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.mtime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAP32[buf+80>>2]=0;tempI64=[Math.floor(stat.ctime.getTime()/1e3)>>>0,(tempDouble=Math.floor(stat.ctime.getTime()/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAP32[buf+96>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function _abort(){abort("")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}function maybeExit(){}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func){if(ABORT){return}try{func()}catch(e){handleException(e)}}function safeSetTimeout(func,timeout){return setTimeout(function(){callUserCallback(func)},timeout)}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=function audio_onerror(event){if(done)return;err("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:2};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func){return safeSetTimeout(func)},safeRequestAnimationFrame:function(func){return Browser.requestAnimationFrame(function(){callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2];if(param==12321){var alphaSize=HEAP32[attribList+4>>2];EGL.contextAttributes.alpha=alphaSize>0}else if(param==12325){var depthSize=HEAP32[attribList+4>>2];EGL.contextAttributes.depth=depthSize>0}else if(param==12326){var stencilSize=HEAP32[attribList+4>>2];EGL.contextAttributes.stencil=stencilSize>0}else if(param==12337){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples>0}else if(param==12338){var samples=HEAP32[attribList+4>>2];EGL.contextAttributes.antialias=samples==1}else if(param==12544){var requestedPriority=HEAP32[attribList+4>>2];EGL.contextAttributes.lowLatency=requestedPriority!=12547}else if(param==12344){break}attribList+=8}}if((!config||!config_size)&&!numConfigs){EGL.setErrorCode(12300);return 0}if(numConfigs){HEAP32[numConfigs>>2]=1}if(config&&config_size>0){HEAP32[config>>2]=62002}EGL.setErrorCode(12288);return 1}};function _eglChooseConfig(display,attrib_list,configs,config_size,numConfigs){return EGL.chooseConfig(display,attrib_list,configs,config_size,numConfigs)}function __webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx){return!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"))}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext("webgl2",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);__webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _eglCreateContext(display,config,hmm,contextAttribs){if(display!=62e3){EGL.setErrorCode(12296);return 0}var glesContextVersion=1;for(;;){var param=HEAP32[contextAttribs>>2];if(param==12440){glesContextVersion=HEAP32[contextAttribs+4>>2]}else if(param==12344){break}else{EGL.setErrorCode(12292);return 0}contextAttribs+=8}if(glesContextVersion<2||glesContextVersion>3){EGL.setErrorCode(12293);return 0}EGL.contextAttributes.majorVersion=glesContextVersion-1;EGL.contextAttributes.minorVersion=0;EGL.context=GL.createContext(Module["canvas"],EGL.contextAttributes);if(EGL.context!=0){EGL.setErrorCode(12288);GL.makeContextCurrent(EGL.context);Module.useWebGL=true;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});GL.makeContextCurrent(null);return 62004}else{EGL.setErrorCode(12297);return 0}}function _eglCreateWindowSurface(display,config,win,attrib_list){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(config!=62002){EGL.setErrorCode(12293);return 0}EGL.setErrorCode(12288);return 62006}function _eglDestroyContext(display,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=62004){EGL.setErrorCode(12294);return 0}GL.deleteContext(EGL.context);EGL.setErrorCode(12288);if(EGL.currentContext==context){EGL.currentContext=0}return 1}function _eglDestroySurface(display,surface){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(surface!=62006){EGL.setErrorCode(12301);return 1}if(EGL.currentReadSurface==surface){EGL.currentReadSurface=0}if(EGL.currentDrawSurface==surface){EGL.currentDrawSurface=0}EGL.setErrorCode(12288);return 1}function _eglGetDisplay(nativeDisplayType){EGL.setErrorCode(12288);return 62e3}function _eglInitialize(display,majorVersion,minorVersion){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(majorVersion){HEAP32[majorVersion>>2]=1}if(minorVersion){HEAP32[minorVersion>>2]=4}EGL.defaultDisplayInitialized=true;EGL.setErrorCode(12288);return 1}function _eglMakeCurrent(display,draw,read,context){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(context!=0&&context!=62004){EGL.setErrorCode(12294);return 0}if(read!=0&&read!=62006||draw!=0&&draw!=62006){EGL.setErrorCode(12301);return 0}GL.makeContextCurrent(context?EGL.context:null);EGL.currentContext=context;EGL.currentDrawSurface=draw;EGL.currentReadSurface=read;EGL.setErrorCode(12288);return 1}function _eglSwapBuffers(){if(!EGL.defaultDisplayInitialized){EGL.setErrorCode(12289)}else if(!Module.ctx){EGL.setErrorCode(12290)}else if(Module.ctx.isContextLost()){EGL.setErrorCode(12302)}else{EGL.setErrorCode(12288);return 1}return 0}function _eglSwapInterval(display,interval){if(display!=62e3){EGL.setErrorCode(12296);return 0}if(interval==0)_emscripten_set_main_loop_timing(0,0);else _emscripten_set_main_loop_timing(1,interval);EGL.setErrorCode(12288);return 1}function _eglTerminate(display){if(display!=62e3){EGL.setErrorCode(12296);return 0}EGL.currentContext=0;EGL.currentReadSurface=0;EGL.currentDrawSurface=0;EGL.defaultDisplayInitialized=false;EGL.setErrorCode(12288);return 1}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_cancel_main_loop(){Browser.mainLoop.pause();Browser.mainLoop.func=null}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}function registerFocusEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=function(ev){var e=ev||event;var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getWasmTableEntry(callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_blur_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);return 0}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0}function _emscripten_set_focus_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);return 0}function registerKeyEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(176);var keyEventHandlerFunc=function(e){var keyEventData=JSEvents.keyEvent;HEAPF64[keyEventData>>3]=e.timeStamp;var idx=keyEventData>>2;HEAP32[idx+2]=e.location;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;HEAP32[idx+7]=e.repeat;HEAP32[idx+8]=e.charCode;HEAP32[idx+9]=e.keyCode;HEAP32[idx+10]=e.which;stringToUTF8(e.key||"",keyEventData+44,32);stringToUTF8(e.code||"",keyEventData+76,32);stringToUTF8(e.char||"",keyEventData+108,32);stringToUTF8(e.locale||"",keyEventData+140,32);if(getWasmTableEntry(callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_keydown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);return 0}function _emscripten_set_keyup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}function getBoundingClientRect(e){return specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0}}function fillMouseEventData(eventStruct,e,target){HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP32[idx+6]=e.ctrlKey;HEAP32[idx+7]=e.shiftKey;HEAP32[idx+8]=e.altKey;HEAP32[idx+9]=e.metaKey;HEAP16[idx*2+20]=e.button;HEAP16[idx*2+21]=e.buttons;HEAP32[idx+11]=e["movementX"];HEAP32[idx+12]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13]=e.clientX-rect.left;HEAP32[idx+14]=e.clientY-rect.top}function registerMouseEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=function(ev){var e=ev||event;fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_mousedown_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);return 0}function _emscripten_set_mousemove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);return 0}function _emscripten_set_mouseup_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);return 0}function registerTouchEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=function(e){var t,touches={},et=e.touches;for(var i=0;i>3]=e.timeStamp;var idx=touchEvent>>2;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_touchend_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);return 0}function _emscripten_set_touchmove_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);return 0}function _emscripten_set_touchstart_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);return 0}function registerWheelEventCallback(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread){if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(104);var wheelHandlerFunc=function(ev){var e=ev||event;var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+72>>3]=e["deltaX"];HEAPF64[wheelEvent+80>>3]=e["deltaY"];HEAPF64[wheelEvent+88>>3]=e["deltaZ"];HEAP32[wheelEvent+96>>2]=e["deltaMode"];if(getWasmTableEntry(callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)}function _emscripten_set_wheel_callback_on_thread(target,userData,useCapture,callbackfunc,targetThread){target=findEventTarget(target);if(typeof target.onwheel!="undefined"){registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread);return 0}else{return-1}}function _emscripten_set_window_title(title){setWindowTitle(UTF8ToString(title))}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}var tempRet0=0;function getTempRet0(){return tempRet0}var _getTempRet0=getTempRet0;function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _glBufferData(target,size,data,usage){if(true){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glClear(x0){GLctx["clear"](x0)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _glReadPixels(x,y,width,height,format,type,pixels){if(true){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(true){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function setTempRet0(val){tempRet0=val}var _setTempRet0=setTempRet0;function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}function uleb128Encode(n,target){if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}}function sigToWasmTypes(sig){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64","p":"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); diff --git a/C++ProjectTemplate.wasm b/C++ProjectTemplate.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a059601e17b7760a2d49f3c212a3042723a920f0 GIT binary patch literal 333469 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 z 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


O(Ys)%4ISTSx1lK{10@T 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 V!O&xl6~g)~{zE2*L5QFC`F~Hm*C+r0 literal 0 HcmV?d00001 diff --git a/Map.cpp b/Map.cpp new file mode 100644 index 0000000..e8dd690 --- /dev/null +++ b/Map.cpp @@ -0,0 +1,6 @@ +#include "Map.h" + +void Map::test(){ + printf("Hello Map\n"); +} + diff --git a/Map.h b/Map.h new file mode 100644 index 0000000..91cd82a --- /dev/null +++ b/Map.h @@ -0,0 +1,10 @@ +#pragma once +#include + +class Player; + +class Map{ + public: + Player*p; + void test(); +}; \ No newline at end of file diff --git a/Player.cpp b/Player.cpp new file mode 100644 index 0000000..716b219 --- /dev/null +++ b/Player.cpp @@ -0,0 +1,6 @@ +#include "Player.h" + +void Player::test(){ + printf("Hello Player\n"); +} + diff --git a/Player.h b/Player.h new file mode 100644 index 0000000..af5d8f0 --- /dev/null +++ b/Player.h @@ -0,0 +1,10 @@ +#pragma once +#include + +class Map; + +class Player{ + public: + Map*map; + void test(); +}; \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..0a3a1b9 --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +This repository contains general build scripts and pipelines for all languages that I incorporate in my projects. The goal is to provide an easy retrieval and update system for the project. Each script will be a shell script containing the following template: +```bash + #Short description about what I do + #Language[Folder] + # #The script's code goes in here. + # rm -Rf out/* + # javac -Xlint:unchecked -cp ${PROJECT_DIR}/.. -d ${OUT_DIR} ${PROJECT_DIR}/*.java + # printf "\n\n\nRunning Program...\n\n" + # cd $OUT_DIR + # java ${MAIN_CLASS} "$@" + # ../scripts/clean.sh + +``` +Each language will be in the following structure: +``` + - + -- + ---[script files.sh] +``` + +The `sig` script will display by default any scripts in the `scripts` folder, therefore when creating a project, copy over the scripts folder of the desired language into your project then the `sig` script handles the rest appropriately. If your project requires multiple languages and build setups, then you can use the `sig2` command, which has an additional parameter to specify the language when running it. When setting up a multi-language setup, you'll just copy the entire folder to include the programming language itself. So a multi-language project structure may look something like this: +``` + -C + --scripts + ---build.sh + ---clean.sh + ---make.sh + -Java + --scripts + ---build.sh + ---clean.sh + ---jar.sh +``` diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..48a50f8d248706f3de38fcc2ae8a9b0f9c75c3d5 GIT binary patch literal 543576 zcmeFa3w%_?^#{HIq5;JO6-%wQL8T2VXrt1aT9p6yoO$f*WN&!1|Ih#P`G0<^ zWbZk1=FFKhXU;h@ckbOEIWsR9l#npkCqILI=lK%odWk?}iZ9=&X-V?R=gahE_=e-} zXkV)DFkpw^U#2Xzzq566DzNPVhrrB9-we;HCt`+Gdf=%c>vdW&Q|`+K^m=2PF)27P9KSUvwx z+RKsklCBmF+TVN568zP-YHt?mkzNk;qttqtY|m>PGUPa@Z)Im^loZdKGU<$x`KOl@ zm(|psUYjxH^eL0ZRh5sMz#@=bsrW}Wb>StsJ`78Ua8ixFLG=Pw{HW|$Sx)rNv^+NH zrb|!vkNa?1?FC!TdG58N23=WuJNkwH`+fd(WPJLaBje+DK>6|bzx1v6_|s2}kH6*c`1nbf zi1GLz<t0K0W!pczo{g=1nU*gfPGd=XV*hBvx!@0$i^D&Qp{mMhmHV=DS2}c}{|1u9bH+tZ+Jp6-i zRDAxQc*t|Lhu%K%(9a+b{WN>DdpY7(y#7w|@Js)KUB&Zu^4?h<^jCVs_gg&1@t$Gv{o9!y zesVJ6W;}ns-J@Sec#QiT4?DctV;nE_(DR!fcKEi3JRf`H8{hNL=SmMgLp|`{@xUMM zq33*$cK__5pTBtIEyW&sd&GnP0uOzbddR=a!yf8A>^#jQ-@ehqp6~H!x5lI0EDwE7 z_L$d4dib|#9_^mu(XVO`J+JZ5=Q@vhx5|T0f=6C-lL!4q4?WX{94AC;o%=>e=we$_j=?lFL>w^&BoQ|8y@rV zbr1Xe4Dy`RuU9_bX&(IBJmTPTkNLIRBTmioSQoc@ z2<(bywh2Bd67S2OF(*5Jeod zFYkhqnyN*P+g>;8D+)Qa~1(LA53SXrRqo1N&x$dp^t?nXu&C4Osw)|FDa-vzh=RL zqDta0t)!@+lGzKY8KngaizZAbLZ}>SD9oBaAEL2r#YIah$}5SVQ#K!erx%qJRTml3 zL&Y}~O{=M_q)}K{a()TaazRa5A+EV0!od#8@SUeLr6dQNoPtVd3hFKf0pMxn<(2bU z7Ydj}T{s_xARF~nlr7A!DyoJFRTfv|r%z!-F~&2$xSX%&3meF%(Iu*y!fIWq`m#%A z=U12K7nD>iDq!qFu)?sHSLRnQttirjMYRP1m9=EWfO z6LV+b^`#a03(5=%lf&YIlH&QAoEws~RDD5lNlB5Ap%7(gKAv7G3NWrHLnkX2&eP1e z`vy*OpbnUtjVfSC@qF|o|Ef!7SEo;&S5Q@4NOVO7rSobQ%qRphy>L+hR9#t6TwOJz z&~Y-#7Z+77C@Ej!6w7LpM781tqGH@y)6$*GE=C(?=I0mI)~2VYPta{)PNGVB{_Fx` z@1V(v`7_F^@@X!Xmd}R=BH=tM_LETX0h8G_QeM;YH_Vo$_HuVm{(AE!-9h15;X}Ac6w-=gTfDN`U-WkiB6DxIp|3_xu~+Bs>mr7=B}F_&vumf|jQ)|kQim`_!ozE}HSuFK6r4T-=tbAhreD+B5spF{Ee3jO{$=x! z+!RrcM;ghe9I~=#UO`DgSz*yUnmierqzu_eKH4doJwE?3j?v&SS)~&5ki0HHB3)gK zEn@U76~_^ zm`$oEs9rQVeFcR{DdBuy<)2SCF1yxnNu;N9J$hoLMq|0REY>8ysR&`3M ztBT`rKm!H&^JqFP2jUPqHJR6!JdSXl z88L=cNo)7ABDE?zxUsISf}2Ecu2OR~dI##Y)bxXYJj8&egQ{||<&&3GB7rd13tm1q zeG)B_DloG7g{2kMRm#v0wHKuav(m%*75h=D$pZ_;lZ&xKP(;qLdJ07*+9^Dw)$imY z^mnOh{9yYF!_@xLw8n!<2PRj}$8N`=iU2nY5jaH5nE{7;z{$2Lue}}O5nA<1Ud@dI zS-fdiKvP%wqk~^Ki+-wX@qm_%lX&4a(9&x^8$V@Byp{Ulzl1Fh|Nx*5IGD7Yqe8p>4CHmzTq-j40AN9EaDg|B!y#~UsR0+ zK6Xzi8_U zm$>bfK7}DJsj8k|cym`?Y`2jM9h@oxy8$D!-Pe23$|!T6Vie}nL}OalHMj=w|sdMK{N ze}kE7nC}QK8-(&BK{*KUVN6Lp4(C$hN4y0$!V||qpeJq#cp^@;aTK>f@+1JCEU{GU z2(C+fiI?C+ybs5HerkmwcQD3yJ`gMeCl_&(2kURnWsBedB zIaSXIM>3I|BppdCS~`-cNtPs>JrO+_x)JE2D$ z$KVgiHuT%#Ij2-$a=yD1C#R0_jRuZB33!U_8?rnH@Ug|kI6*SPH&){AxcwJ6@saGC zDB<-C5BHrX;hN)%aiZl2-weR?q4xISOa_jv_)_stlqbcMe_)hX%=|u1Y7F+}>iS3c zdSyAP`wIGg$tOszmF+Fv_BiBE@s%i;%a8IcmGJA2-vE9``kEv>pUa2&elFp~3=j3) zFX8I3Kf}qb!+lRkxRT2c^KF!H5yOeTmnB@x@DSfS626h)LB5Xw(?>mb2&Vk$ULw9b z<@1ON|KJL7kfh7Pw@CVkg;qN^U2axdTv+yrVyzhQdPqiEQfuK*Z@NJU+ zC=0(=@=3Mu-k{ipBxK6>TZG0v+&p5EAVqI{FeI!evySgtwrD~Ec~w|eXWK6iKMT$ z@Yk;qe3~qLo1|ZD;ZxM}(iZ;99|}IL7JitVk8KwIc!_Vf@Dn7y!@{S^b~`QnjyB;3 zx-9(WCj`FR!v9wKnTUnoD)GG*Uiqs&3$Of@Po6ha{#N;`Bnz+nRf>gI{wmeN=g9u1 zS@?_SKs7$&E&L-AUt!@ZB%fLf|IwX-PrZfr|4QI{E&O=NC-1@7`I{;6y%v71#HXtH zE!g^+BtFf;UnS$qcniN;;#(|y{gooFwOjZui4R$LZ9f*iSJHP`c-7yCg-@Xe+3@ML z@T$K)**|3u<0XBPh0m1mC=2hG^l27;uEb|p_U8uTW<-Jrk9pkHLroA{7HUue)*81yE-!=RU` zD%Ywt=uLd5K~K57`qUfrCcev{FHyw!ZZhaie78Y=jzQmS(3|)q=}*W`UNGoWJn*AD z@Tng7G!OiE4}69PKGOs5_rOp4}7x+ezga_#RK2!fp7D`w|n429{3Iq ze5VJ#%LCu-flo5*D#m_1@T(2{a@d=)^)?TDhX=mf1K;O?SMizb+-$c=`db^{YVg4$ z4EmE|&}Rax6vT41C1EzhdB1WV|E&JZj)GrGLX_1ivRn6{+V) z2>-f5;ydXP(O=rPAztc}V&KIJNR*5+@PidGzEcgn;3x{y3_P{1KI08M=~{g<47}P) zqOwc_uVOsm{RSQzLi&?q;IVO|KY0cok0$BQTmz4dDE(Pv;PHr%{!|!vJhG%ewFcgN zF09_bo6mVQ8F)N`sz1#J9*@H5&uRmYN6+-9#lYi{G5u*Z@Ob1+f7%Q@9_iJeb_0(` zpY$hW;E&f>>^m8FJff&SodzC{cf&Y%i`h496KGncS4E$&V-)rDcGVpx{{uBf6 zdo*h2V+?$ff&Z?7PciV{Gw`Dfe42qzHSl8%e42s(zJVWa;7>L183z6|1D|Q&PdD&> z13%8d=NR}i41At}A8+928hGApmt~6#`~-u(!oW{7@U;ehl7X)`@RJRElYyUN;F}Hn znFfBffzL4TEe3w7fp0bNXBqf51An%GZ#VGg8u*ZbKhMB-82BF;_)Y_#W#GFE{P_mH z+rUpV@DT&=82DZTe}RGTGw>H0c;C9H{re4kl7XLL;8P6zMFxJ9fxp8~8i}KgYn&HSoCxevyH{+`v~D_$v&2 zt%1)o@bw1%N(0|y;IB6D%?AD&1Han9Uu)o74E%KlzSY3z8~8Q@Ki9yw8~6ePA2RUs z419-ypKsth4SbP-?=tWU41BkNUufVX27Zx&?=|qn2ENb0UvJ=jk45eO1_PgD;7bjB zih(aP@S_ZTxq(kL@D&C=&A{Ji;Kv*IN&}x^;HwOLrh%_E@O}edW8iZP{9*&2XW->6 zA1Q2L2`kUvJ=-8TcjxUuWQ(4g8M`{AvSVZ{S-D{0al# zYT$1+@NEXZ!N9j0_>~4eWZ)YOe20O*#lUwO_#YeiE(70W;JXccz`#cg{7(#guYq?B ze4l~8)xi6H6Se=Kflo5dAp_rP;5!WbuMK>sfq%rn zcNzF~2ENcmv;V;4=*TGX_4>!2jOB`wjdC1D|8yHyZdn1OJ?XpKIWsH}H!L z{3ZimVc<6#_*w)1qJghB@L>brWZ*jte6xXn$-u8R@P9DyEe8IN2ENt6zii;!4E&!A z{Qq74p9cO<1OKOi|G#PA^W<-T>2KJb2I3M#EzmzFouLWq5^#zsK;68ct)lK*M7ho~7aMGn}R2QyEUz@M#Q>*6`^JkI?Wq zh7&Y=2E(83RsA2&@CO=BXLy^2CosH8!xI^PLc^07UZdg34BxKdDGaaB@R3>xJGa3Fs!&wY()A0EW zZ_@BIhM&;zbcWYx*kSl~4PU_U3JqV#@QoVwGhCqI84S(=|Mk;n5n- zW_W~#FJU-A!6fbiIShZG;aLoC)9_^sZ_@B=hM&;z9ER6uIG5quHGDb4D>Qrs z!#8R;kKqChU&-(+4PV7@mWHopI93P7LjD$sB-!?QGeJ;PZVzJcL% z4VN%HTEnFbkI--#!wDKLXZX`T)&B~HKhW@v3~$qLCBvIET*dGc8m?w|jfQI&zFotM z8D62`B@ExF;aY|ZG`y7ISsJE|H_U$x-^6gbhL@u9L;aeFVt>GZUBQ$&)!wDMxDZ`)sOZC5*;SV%?JHy*F{4<6(Y53<1KcV3}7+#~{ zRSe&*;a@PkLc_mg_(lz{X1GAZcQQOn!@puUOT%|DoUY-!86K_Sdl(*};d>cQ(C~c> zfBH|={}zTn(C`|Dw`ur(hBs;W0fwK@@LGn~X!t>fZ`bfc46o4e!wlc3;Z}wVH2iCZ zXKDBmhO;#MD8uO*UdQlg4L`>42o3*+;RFpo&hV#uRR7x;{y@V|FuYB}zh!unhM#2k z2@S7jc#VdiV)%9iBikM`ow9AjNy@JQUwd9GoNK|^7VKE?xfVRxf={>LF&2EH1&_4g z;TD`|!C##lEB`+&_+tzH(1PE!;5RJz6$^gRf;U?5Qx^P~1wUxP_gL^M3l3UvqXpMl zaE%3*T5ypCUu(g+7MyLtjs>4G7F=qtcPA6xK;7W}RSzhS|zSn!J$ywQT6vf#%o_(2Q4$AVW`aL|GqEx68tYb?0b zf{QHpS_{s#;A{(aEcjdto@~LVTkseQKGA|lTJUfSPPE{!@Vf?PKJ!lt{@8*)wBUCw z_zeqw#e!e7;Efjilm$O#!4F#SJr=ymf`b;^Xu)+BTw}qd7F=Y(*IIC{1!r5ZW5MTI z@MH@<-Gawh@QD^Y(t?LuaH0i&m0^v)1%GV8A6oFc7W{?m|f7{p9$AUqw zWRSG4djZcARiE#=K34X9R^CDKk#Aok$(5w3jjo3`h4HM$b4*8Z%rgK zOSl$wb^BC**Algpor{Y8KwY2Tb^5|2=03XG3WoHRnIOLh$?w7Yny-CUy~DwGE06scTe)uPVc7fq@kN}v3pZ@3SUGvb&nd_8Q4suffO+1 z`v#h8&7LR^x^i>(^r!L%YI?aa1%G>8-_*^?cZ4iXacEY>&@}8GkN$Uko;I0AINknW?oNLY-+@2-1L4SZ z*Fa@~&7UWyB;NJjAS~8KKpjE+6U7xMMj7LG3;vl22i3q=SL+7Oiqk-{(Euq29mpJX zPz~H2ZQ!kU`}g2CC{{h7L81l*CqLcydGcuvhPs2kdy}8;r0?CyPxn&ivjTmjn=RNr zcgZ?(`{w&kJ(e|HoftVAyDBdkx>5CkI4QS7#3~d!Z;0_U^H-$BQgOS`f*0&*VyOyFGfVpkzO@Nc4Ll^9qg8q z;H)e4h%9+WC~Oak_sHUzC>A4fT8JG)R})QeGPJl;#j~B)@^m}NaoX95Vym5;gn_1v zXG6u&h8}vme}`_0)6gJl$es!5*zfr-^e*klQ_Rg*XnpK^tG}4rQEcfWzTWrO&Q;NN zei^5olK$;@=zV_;eR{d>(6~4a4UW@LT)jW@SzNs%c654$giefKrw9%SodKse?ChrK zX<7Pjg@9pa&ps~HHvS?CTwjy3D{9!1Bir}@Ec3lsR!Wv1MNL?-qyR7g%Oky5en+zG zku1s2CqJFtgQ)&d^3yfDXwpjG9)S~g(LKwz=YRTNXtpEJIkv-7x0mPg;P=;UF$%nO zJ22A(FQ&&zrt!5qFw=E&JS2S{1tjSK=(h=5?{W0I?;rn#eh0FNzS$l!AHg#B_sh!G z$VCreYb{=UpG1M{lYC8opcwDRh%fYFd{qqN`1Ajh|3Zrck9`~7284XDzm>j#0^Q$~ zxNcxz&X;>}E;c!PXmViI|G}$8;tG9K4C}bMEd4mHEJlk5&X&Bi9gqN zTRKJT&hEya#FJj5;C|&Mq~IaW%u}*aAtiBG3?7+!3UNzG{A`;^kIX$K8%?Doz8!<7 z3{H9bFX7hXh<#&^B{nUsu=J^cSR;;U4B)OC@_R55DI&Mqbf#+`@S)!!Gta5od8_vYSS*&#Z4WT4zHZT}t ziuGnVGgTGws@SA&j*iT19F$8_ee?%%ku&q*}){=f^2m$F@bDcM^W(ImlP`Q2;#`b*LksM#LKjY(S~VkN7^>WYfhrNp{@ z5ceBJs^491?)CutB{#P-kTV35boqlhI2P!1x#Dl;kmScV`B(b`Tm6AIBST0$Cdx~~ z;Ou-33fxD+p4>~qqL$!BwKk&`t(&Rl`;n_q)9kU9s`wJ!O{QTRG&;FTM_7Q|F7fll>I7 zI}qUBOn$r%%`(A+X!(rI34KzKS0fXJAap1}@Pq|%J3|^G2?4S@%#t8l5t}GY7n4~a zrtV+~gU$|FFbxH4WoS70@y@Kkb|D0Fp`9B1gD8T_`HIU<$pz-fTR2}`L~5Cy&@JVA zKl1Zz!k`OeetO@c;cqa%hArc-&br3f6O-c~sM!<9?G0q_Zm8Sij?ZhAvq zudntz2-fFj4w>ro)=i*mIZ_}>e%$E|Y=U<+MrsNPkh?pO(vGq6^(690#abO1kJ!bc zC=ufTOt^U z2yV*SLPSFhq860C^Lg@B*REaQPhQ@IKV_lF6_I`WKI2Zcp%~Hgs-hMu?iR%vx_G_o z5XDQ_9i)ItqKdY=TxY#mfObW}4hpSH{=iZ?JYtBBDTzfAgJNtihMn!gDs#7EK-Npk zEc8R6qry(7EbByBn=HGK%4piO2HqB0z7MAr15SH2|>qnSHCpyv)!fbmPRzQqj zmW+?@$M^zfyg@3LtztWR%e7IHMedZfcU&k$ep!kP?powKs4Pb0-8f(vAaBCMHZbR# znX}P@msJno_HwD64k<%kzjjt~J6o_J{j9M!nw*9qyfV8R=;sVHZTe!I@;1rxohZj% zw%!y@PJ{hlnM>8S8faAwd%;&a7}Y$Pk9C0V8H3Jfb)$h+)y-Bn8RbT+FB)i7&2ANY z6;8WBXSBM(K&$FztH>ea^%dIFXjRQ_6`7i|J&O}*3M4Q5odOA*a;zgg>w^P{Opg|*3ot?{`Za{SgDYSJjy9d{CI`?ZRL3ZxE zzjEh95RK+!#^?q*nsRs3O{L(-zzB>mXHY5h70yh8Zb_Ye{%~drb&9WpIitwQAM@fM zpPM)wf3bWBQHt7gE~luvB8B4WGOj}w639t`8SVbIFr(8hP-c`f(;bHGt_Zfh5InPS zuWUw&J7Y*z;13!a8hAA;&>Pq`J@8rpH}qg;+XAGj^ zk*z5Q)4>T_sDr2Buj=41>R>}%#8-VJa#`7ayf%@@*tfc10huYdWtqJ4X`x6)aD-LS zEiv>0g{|v0snr@)5%E=%+#^Xa^LycB)XJ^m99BJevZ6;p(G4dGMZYjzDZ0Y%9!>Mr zosq;gx9>HOT_efv)?|5pcNqB)zk3<%peEujPJ({-Z9_+?%jOc{{T(q`1vH+5$&L|( z$%yV&Uye5VP7tDG=r*J%eKDeJlVl?_*<2wCn6W5*hA1(R>lTN-`L3dZae3~i;H6wjs7KmsxK9a{^TT_AN6MBNrTlt!K&YY9>rZTc1E}-$_2{4Y@xoytf43cmJ;5pTP9274t(%= zv;%>&q8)gWI{+V;+X0K|w{>Rllo$#B4D^h^izX#`q?v&aW(Gcz?7H6Gx36bhbWcXN zdb=1|R>YI0U|N1w7#s1}Z_L*EDTPPZuUR67WjP~omW$5=1vqZayTg5}klHb?s) zL8k>4QjZ{kV%{!$<0x=VdSw4 z`6Br_Oz~I`b|&OE^77gK6}!8*;>HXzm%vlw`D+y=)3!~xjZ72tSNPpVqI;IMb$MJ~ zja!y|%Z1s58#7Uphs@v?WUR^W5>m7r)SrQo%M^i4aQ7|1 z*UPRxChVw%#_B&1A>24qvhSG)DOq4C&N}$dzzgmwA`l!nChY=;rcn)CFF~|2m4V9V zxqUat3yUC4hNqYxn(_}r$HR?zsw*sLV+C_&tUu6LD2IBk6XH#ju7O{n2W48K+t~?eqj27f~tXn~N#say7W=;3`J5?QeTFmB%a` z8FM<#TV3Nhc$#qI9NAFM87Lx=iP=ryO^TyJs3at#$X>KTiX$`>M}kddpb{P+D4Oio zz3|?soI(GPI6ZlgD3odN)JKDyv#jA$a-uWv)p9P^yb3F0g+T~X>Qn}jZ+;OEQL~HS zVMIT&DQRcZ2}iPUZTpF3JvG+s|MfP~Ko=?DYuKYM)mm!;LC-N7Pr3<5{`x1@6Wiol zNXJd5Qcnb1C`T7;9|qgV{nQNKWsq}yJclXV&Vf&XGeb~<_dvzpQx9-tPN8^>1PXE$ zY|Ova*+0`45_(w!z3n_}8BOxu2~EU!fc1&&0Z@xQKrom|jr8Z!#u{m4Nn|`Oz~~1Wr!##}eD!O7 zsa>scF44Q<3j&=*CKPDQi^ZNVu+6~k`V&o$prAm7Uy7n8QGvgJEqH}A)YwMYU{HMZ z6J~cOH_fHA)6uAEzy3$64NoTZ^tSY6zZVslEa*>-qn0~kC{Bq(v4kk1;;;Jw`WswD zJ=0h=lu{I|3?(;?;5n@atVwjNljsAhxfqhS4Ns?W-xozrrA_*C2tdDK&2h2Km+J&&Bi(RmrrlNu!=X~*2nQxvg(I(1MKN0BV*_fm9^+ZwNSsKf+d5bY z@i^Qb<-i?K9R5fgqTSexMun<*gc^kWG5n)a{gc!g9p^3V+Tx6JBMNAogK&nRC-sxG zC;gpAK!A;Y!Uol(BFNN@9A0CyKhmViLIG*|STUo7guyhX69a?vfgp5sC}rf)!Q6Q!O)SZ>8#J-E1)n6v z1cPR|NW3^R&ik!Zm&RKT~X zQBr}F*og$*B9(r-ml~p&ZJry5*%6Z&=|>PTx>umqV_4eMG$Zh1;g#KQUFJIV)P@g( zfV>)Vfy~9)NreBKpzB@3*}Kv%3OwasVQ66|gpq;A#9}Id6+f@~!;vzcptwmS;YS4A z-c#e}TSwu@Ow3apy=-zGM_)qz;IstP4}qR#xMnLUcoTHY=Ia0AQ-5HapZ030oae-^ zF)zVjg7bKj^BZLD_(yVaSt7eEx;@jFN81qrc*h&n!UHE5eNKB|tc`n6j^<72UU#n@*Dz<2%8{xdeF!GOmgUKkn#2!c& zvWX-TWR4h~F5GIMn>0)k&K$2U=^pNyb+kP`B6AW~ZwO^P+l%7od}R6HaQye7F=C7v zOE)NP2DzJ9kH2dF{-QCGq9NqxSofUpsK`^s>XMw;k}c7ayjTbQh%5I->R$S4C24ide zI$Y6BD_qiRAH)zPw$T*^t>Jxz2}#Vix>ZfuqG0lHJs(Ap(AIiTsDhnzi4Qdpu8-h~ zW)GV|B3TEu;i^67#1v^N&uh#miFr(8QYGe?Zoy}3JzT!JoT@Iv^_W$@F}f`*7`UzM zO+0mA#`PVvU8V^-DfmN}OW>@9cwNB6j$7XMWLdDe8-+AjFaDYa>tXy=gVlJFVi1um zU(!0n@2GMk-{=+s`x8e=%$4L9co0&75fTJfr%`Fp`8x@Aa+tjcu91=^Hm(^2PKbr? zN6uqUB#3U?EV>u2_Y)h%DKSSj^X+cMyLk~%;>c4fkpOs&eo+z-_-w5&p(|n)t}oTd8x<0ouawwu{SW2Uf^hwEzT8@0uL%>Ia7kV7Pzoep z6dd`J7V10u&axNea0U_|P2de<_$@>(q_(?oF9ky+&Jju-mSgmL&Q(ZA=+|xBA_u^) zb#vj-`P6U6Fw3MvhuL(}M>h71@;st3KU+;OM}GS=h*EB9 zbSo1L&vyf zV%$3VA05T;;C`B$y(OxnRpcxwwYCOi3-zx1f&K%6*qM?TmIcJe7?59`5W_5!87GEF zX928CXmtX+t0mpgF-{4u7jSRSY_MZ@bvdbuZl2Qmq#-m4!gaWpofCLdTx10PoW**0 z2Aq8X9E=V}&fr5sPGoE5hy=x^hX(<-b(t;u$JIcs4AuOCB-1xi=?A+JLI!<>sSj4? zb9R9PLm$=Sz>quqy}g5d&yw1CXmMf)w0{PUXpd90o73p_JdPdE8HILP+Q-%&<#b0J zPPavDCsHWMb$?;dS1 zag1zkDCtI=ic*5pP3%>n=zS1M7|@x||0BBkCOIzJAsmb$$(ZS)!%l1R)10zRPkx$) z7dKNYYN74Wv)_i`&(R-JQu=pL6WHl=5A`z;NaUNGrAM5L(9Sjc4Tq>OwGawCqtL zfvf|+(t#ijM;4P$4kmsfn|g;GGMyoVEs9~*(jU%ujd~J)&ofi5NpHmlEpI>2Jzsf5 zc#OFMX$zl5J*A0+(Kx)D+&*^O1Lvn9JW%kb{d|4jIq)gYZ2zGtcW0A>GmO{n1m}og zN4394oTk2z{4+9?Yq>1g9740WlP3=FzZrRhv?W`+^L=g&PVoFRa3d>$pR{W{fErDC zBd8EwcV|;Gbp*CfK{{q11U;yW3@l+IwXP%_?cL@X+-8d13N)RHM*8p;hCptliJoC} zBJg>cL+HXyf_!|EO1QmE!nY&)p@#@eU1oquSD=@U?;?hc$bPvg_JsmiTtc?(VA>Vc z?n@NZmF(xBRp(_yP#9&m;bkX%14L9!s}YBBco*mz&Ixk6k-U(jh}llq`8yg2E9?3H zuBY!~KTP)&8ED*|UUZySPb;Z94jUQ)lV{`+aw)fn4JW80x&?P_vxYS%XHnWji5 zlm4O_R;K;sByP9MJvxx%m!@Nm`u^I8P<=JP^h`#aHhw`g!JHf(V==J1fU;U68wG`& z>Cq<+=nmOxm?Q3x(FTf{o$-E#*s8)z9=shyxE}%{H}jkT-NO*q8E8}7@uf+e)lPnm zBQ4GUFrTCmcNT-IL)4I@MPVyxP%Oe8=K&IQG6M)lKEjSyFpoBNdA|%bz7HYTPm--l zKbh7uTCGT;gb5_A$mx%N2Cj1CQ~kzRYsAe=i|WI~(i>QgWTk<`RS!;h(+=0PnM06z zp|d{IC(99Vd9~l43u5El{c1!4H9K)))=$Tf3p@RRPJcqkpMbv|{=~UhOD6v=Cuu<- z_ba^JU|5s0kK0WC9pK-+wg7;CC{AwYVz=@&|E9mB_{ZQ5d0hb=BG8?Es zqK^g!$p(fTOascwl|J3fyx3OR8r@7h{Gw-_qJ^A$w}L? zuuPa~%`hJMUEieC6lgbdJdod}OQLYI*SWcEZVjFU2}hc-L%XY&k~Kky%%tYK2*;0~ zv(KZ(byS1WDP3bwaw9KC6@M_#UN4fSh1f{OV<5yZ=7@jF$d`~fBQD_tFzu$dQ;?j5 zqyPM@4KL_gK!E35#2Z<#o^sY19JuC{+1r5z^N`q<6YtdF$15mu?m*#VMxjyX6$7oF zH{h0$v^c*p3XM8{GSD$~FkMKod1>^T8iWS)=`_lI5V=nyA!rHFnWZ0G7=~EtW_QvM zIO~PKI|6&nJ#==QhN_`&a1G@~%#yxm23vR~&nOI^q246yBL{FpAc#}@K{2e(`WZMp zzIA5c?~!}Q?PY-0@VNL*AoH}>Axohd^Z#;gq+RbgD zOWHk1L1Nzx*v(!GC?X8=?W5@c=V~|mZs6pSe=FfY;H-7=@+qeUGcy3D&K@+_P}k|J zDWMup%hb(v$6$f58Z}$w`us0vP}LSJCVI{Sx|_O9=MHcLo>xV*L~o5wdbeh+n|+6i zH3lz1=t+_Wr#%63Pj%XtKevk(l?`>>wvSR=V<;0ZZ(v{<+Opo3hKqV0xxk{J2B#h9a`i0dTwfP z)+aR7ZSXA}#$qKn8+uNs=9eBuDyuz`u9xHQcHi>DNUJ?V8cIpGJJ5lI5Xe>g6$jOR zgYz<&tUue?l6>n@4DBwQiRD4EyN!-^*xiO@bf{+kjniL;)a`b3JLLNjy3PFv4b<)R z+-(}*E({iRo7S?d_N52azUX%Q*-nS(Hce9VPUB0D#_S=O9s{v1kR6#Gz((IrEb=LF zF=Jg_L_Wmq1UAVxzt9~jYu9l+=04>lf!yvu_72SbuIYgeEQcEEcKB+iV^qKBqNjz< zl2_f!#-kOi81d{Bp0WyTM!qz*bE>mr*(im-SmL`GUw1g?sM0I03?(;~^W@v%OTO)V zT;XjSWOiVWLuvRMJl5AvD>m{jdv_fT3iNC{JQmW!)3^y8+Ob7-DxTWe43`Ke5}cIa zW_L*;FyTeDA*hyaRinqE_5{xvgcJxp)|g(dV=A0=wW};9z=AvDBQ6w;^=9lw`A+Vl?@o zs%YLDn=N7nfifCkT|I5&oSBP((2-R<_#d4w=oQSA&IzM2H!~?3f}$8Ytvw7c$8c-* zx=3)df$R;KkL^|*Cf7_8a|2DxEi^ItD#R1B zgC^#^^yUpHd<#v$4LmU!|67RnJeBca4JPL>|w(#2G2nkw;(3aiq+|slPmHRVkpOsF|^z5Y{!9iH<#!W zNMcP+{rCx!?qCbq&K9y=S;&r_D%3@EtiFU>?UJo-SFLW3ZS@CW#qD*e_O{FRBq6nT zJP|=6vc>H%Z??OxsNEqmz1-b>#(oMjaUTMr&sU{!Q9j7pE#QVMoh6P?cpdtG=Y{ zqBN#DDzU8DkabUgSvyp%Gi5Df4yhAabZZPPb&+hh;?-NUJ1(F{03|>ELV(rD<(C6P zbZK;l7D@{{-DLaZhUm=_!DAZV`|aH!C&n%%-YbEJ z+ps=KoVHVJi#HrWTU6?%19l5~-RwP_F~eT0$jm%gSNbku1nUd=GzUF|gwx$&XRj2k z+x0bukfUYqP3ZXss&%6o5||Qxyklet3I;Jc6ETtLhV*=s5qtuT3GpPbpiF{yGS~Fd zFQLT{?9_Hi;DWm#p$t+T);*L7K{&prlY^-ez)L?U7ms4kVr)0U{Si(#FR0;ge7oMk zU*JwAT(w+ehZzS&?^vFQPW24tOo49c_0ovVJf0Q?I~%$w+|7X?A(ujSJ9j>W$EmlC z#WR6UhnsT_7uF8Ji|YF5T{w`)y$JIRllF&0#{N6->YZQgOTdDJEW5+Srkk^8*S{bY zbEh=o0%j1yeJnQS&|>D0FS_VOIi4(KlCz6`8in~$OrIqh$`DP4+zOiX?czKj@r;U| z!L4MNlG9D7kb9OP_nw}MnKdO!Sz(8kv}CdU`AVUEQJLc~11qS!=DWlJO+nYNrkIgk zjNprr-E}6sCJ7#;GDkXxsk(R3&(nc|Qd|8}mQPy9n)N!AW(;0SOz$AxgA@M&(rsT; zGoAB^dFQYZzyBvbb9|f(I2-pf@chTjZhPs`;rH9Lh@gX0~JRBLi}EX;?p zN2S8F5JKp3d7Dk?F$9?ad7k_QCD%$jZ6G z!QLoTdpH@f*xJx`qV55yxAv$ghnk~A_U0Ym4kt$ses0|;jztl-hTgFw;~*j#n50m{ z?|otriXg({I-_J-*hIl#tMe=0R_8A41l7CzFdM?l zY5w3U@m!lzFN4GoIx7-fMeM<0rNn-6B5fhnV?a>ryC|r~J{;?NJ4!%L0vPnq5k0dO zRnU-pfKJr9*R0jZjfoi5NEMxx0S6m-Z2@PU>(tXO3zN9HD`_QqH+ESNHAmp<3+&R| zjoa909EV+TL7_|Z4$=~Fi`z(|$*OCyDI=<`rK)SO&!Vcn%vBv^TU@V|Hqo$Qw0ZeA zu>IA7uH7wF@mHMPfG!j8NHn-f0@`hBl?0oa;4VzdwcGlzEoUe^c_lq71HM$y8FsqJ z5$(d(B{KXFU5A}5^yND1&UV`Bj>0$ZBta7!dNNrf*jEB>L(hZ;r0LjwN^m-P17@t# zSzq@nU-c=7n7m(w&92V6zY(tH7~m2}m%w!`+uAdv8R;k(G&PN-2>#Men6z7GeKid}`jUL>7Q`~y zA2HBuxd&t>7;CmrX(nWZWN>QSzlm|DO~@8GtUbtXXxw{-&`gSsAcdKC>D~7R|$L~8zKOoytH>3fvkgM!i_8j#+y}4&xoYDMV zoY6c^jHZ|rQ=PV&urh}K(ZGI!$7>E@VBuGs^*=f~+Oy=_enTVM|IH-M>iw3r8!KJOm4Q?+IbE6)|ls@58m=KuIgMhTe`DYXBH|K1n0D zZNpBdK=Ps;azRhpfPg#s^{Pp!zt2Y$ogC~+f&L#ZrD7>1|&F-Lf#EpTcegl)o8fpjL zowt_Wo!6FtKRXjT0%0uA6mmTwyMf$F+~jI+A2N@futH>}Yb)>6E3mbdE5#Ug!neo{ z!Df?hEuhY@$HHW05$MfFn7~s|uqyzmk=$|zBiw}&)jK@Jj~-n(a7T7OhK`84KfAFg ztXYp-2|o!!oyTD?h`Jl1#)!0g*<%f$Vc(*~i7X4S#l@VaiI+XhZvQKE>95=Eo9C~A zov>v{wCombnmYSd`8`<|*;rqoc_$=}S)s+Dp`MsDSy!mjkSlgCf(_wBOb0Cy15btc zYgIdc1>5j7Gtk(|U%?ha!gBn9#?`nqv(FBC%S|Iy#;xuoToOCF>zyg?dgsyE*x`@j zMJDueNAXfDMUIyUMCqrS^fyU*s{2!1CtpF&Tz7&s?p&+)Wo7akRTML7o5V#G=%FFppp5<33w0?m=xG0@mUH!?#L?qRb8h=DhQH5fP|cD27{y?d8qRq-10^FC{a#) z{J|hoi)iq^C{GpTOeS*jv}3qpgji|DOeQMM6Xi;>!7SNZi=&b~`j0r0QTL@}gZCqu z<0aWeqUByM$vTXRSR3wooLo{f#e8U5Saly5r?$e4P56@iVT`+qFm`{E zWPi%gALxd)8O$4HnCRElWTJiet4#EM+*Pwo&}FwGd0msjmexnj1%tu_)#LT=C405= z3vQ>`Xy+`^4jZ?-s+HKqw6lkJ4KNi>pgsi~ePWKp%5gdBx~oV;()?Z)HD>%aB4u$K z6~PeZ(Qo`#GZ8gFTnr*}{HkJzL{t67?-CHv_{|7x&3c}OZD!!pnSuYz4D`;#EmUoO zsZzzyV@jaO#M7(DCyj7g2uPK{S^|!dKq~=k+b4*n9F_C4V zqz9wnH{n`D7P39Vp`7*+KXMo(G#Vz!L5~w@IJK3B#5G0~4vYxNe*j64O-|Rq8|eF0 zA!$(M8l3px>7r(O`!2Fd;rlQ~<@h1-sORk@K?2J2lBSgBRoCQs)irrub*(&aGjRyB zqn4hEG486>%sRg3J%4{QcQAzB@63G<7VL6gp&_rC`%Dax$IQJ0M1B!TT10b#O20`K)f-dpT~QMiDZ&s5}6)vMGTQ>s-MTZ21KN{ z1N3;WAaR0RiD#D?9&elk*yD|s0DHV+C2%kv?-DT*G(}C1C*Y{ZBRJ~u2Ve6@hYmY{LdCeiy#Yi+x`|UTQhOE|Dga za)}Qj6dHqg&4V=$58HR5X*g7A$lk_Dcz{Tl$Fv*e%sb;9%U+ z??@ZM_D#1$bHU|TDu_gk;HX<7sGnOpH6fl`dW*HKgZ!`u$fEa~i2e0`kO{X`dkfrB z)y-&r#TN28hFj8S#OOJl4rGPM!174Yz*9N=waU+5!AyL?A7$VRH^L_2%XCYzkMcy; zkc9j~L0Z0n)@`I32zvz38cSxL%h5HvELE1xi&KW&mvhrU$0@^PnC`Jg5qv#sg?}DRj+VVRJso|H2&ZTgH(a4t`s?ys~_VJq$mn? zxJSI{Gfq{dOUePu2+zC*S;IjuiZYPc=Wf zpnB4knjg4fE?xjCo*|S_zxi>**BCUhP+>z71OCimG;8!TTp!&>BWpfw7_(3j74d5i zL?-4(UIXUG>>ojk_7k4_pA)z_d=5I|JsIA)mklikL~=4HvqQrEx5M!~1&#{fOai^g zPRx!FW(S`nnv0HEMHo{qa{3oxOt|RT{zVv0F4_m*Ys`o_G$U5gP-&5vtQJyXR4Khs z2Azq}jmKHUmSWy~JtOdf)Bg1{M1AiW@eRpZuu#LRd%QR#sV7h z=!{S@@JtY0T~8Ev|Eiquih-IFW0-+CClrM;{Q~3>?kXBvZ}T4vE@b`}7RH*t(>;~j zO}_b_|C#M4|0ka9ZyX$B`=8(mzXP!SFp&w{zos6xf5oyxvV9p3ylwyey9TiRkA@6n z`}5H;58I#7zew5sbN!2y?GOGS#`bUUu>EC_Y9QOcreI*(KS$K}w*7BO24wqZ;5x4D zcfaLr``6Qu4`}=CMB#1wW0?WlzM420?45*Xfu7=2R@34l6b}>;dht_zG$kg@^_mj5 z{LiMuUOXn$KO8*biiSc0nA~i8S!aIQuASe_^}oqzap$oh~D}I8QXqmz;B66%zz7jh#7D`?&J2K0qvAG$6F%=_}%Q@ zvEcPps2FCUDEG!a>p}RkELmkf3(y0rC{^Y#7xynxMjq;4q>McA9nt|$xPgp#`PJHp zaTZsRd)w?KlAdgK99{pQ2ky{1-*4;R6$S1R8Q5_v+U|xL5Tf40(Ec4SCA?{ z85~GK3(*=W2Mh5pUY8w73J`O;2iwzH#?nr8kkTX-9da7f7K@1+-)Q!{fr3xfCJu< zf#$?6_M$$Pzm_mTdfP514Qc`g*N+A3keFsa zzarY@Qdxo_OA@15KgIW!p4VwOoZTF2Rf&-* zSU>iE$U?CHV?601ET@?*NBpb}USdyr7w4U^z@>SEO`j5c*%pLTw?Z%;@WOx7*f{kx z+PP#}^t1`{!u9zW_PE3S`JYgWUQ{JWad4|%8rzef3Vt-u=r9R|OH4&I*4#+kfxcHT zl>_}qZgikm%97|n-zrK&G|>DGEYf^1M-FtEQR?n)lztzj;>;%xG^s7%V4z8H zc;Fv*EOCw+J>^jj|1@Tln*bW4yp%zD9;7Mm5Iei$3~_TA4>1iT53xGIWZq@XfNzU? zmlgi4aXar}^NlU6?Py~gcU$SEpgHVx>?nGZWN(m$i1&}xy+(bfI!V7D_!s0KV8CM9 zoiHal8vlA(l+b8kY=`fiO&i8v;xBv=kI42Y1#cL?%@o@Wir+>lVecaZ%O;2q?%B_MZ@2Rto+#D#rYjqqve z_G=3is;<`>*K|KZ;SXek8p#i{Z^JZFcRj@2OEC_2ToxUNGQ5%%!FqxZEYl8h4+F?_v?Y@Y>uCoflOZWg@gE=K4p#&Lh7Mv#VO6l4xF0bm??=oVc5^qh z>L@QJPrrh#BA)6FcP?6D{`!FA`LPNe?%b@{R zoVHqx96%^W-!r&g%ty?{EBRaywL{a`yGDkn!M6-qq~x@2#E=K67HadickM4Rd?M;x z$(5;BsBfsgimKoQM<<31@8neX`uKdO8n%zZ(P0U$5>qkQje2q(uf+)y zZ#gd`Gt+|;ZDRPZFQN4A0sK`Btw2NM(jEqmxD|UBWH`9VDGzPw zpA2ag=TK;3V8EDNFz6#lc!zpp3do+tc$cF;8K`Hq)T-{8w{$t6L$^rpDZ^jS=G6we zmpP<=6}4E;5>*l#K@C#ez}N#NBs6TKuffT;)!<=HsTp!gE4{31iLsnlI zE(%kA+>fcJ`@Oe!IFX6vz}?qlIq=H`kaEQqitX|4?V0i4^OP0Y!FDo$K%DpwnNkqm z+o;^72i`b_dS?ZHYovadS%Hc_F4t5Ckthr=??-}?{YY^C zPVRvo7!@|#X+X6)U=Tk?2%8fZM&qFjn+Wk&J*CKc1zE|pQ8FuRBC8%C zJWPZTFb4dKhE1AQ{e7dl$(A5$^b4C*3*O?vfos1YW*@gl{UQIdcEI*-7d2wTCRK?O zHmPkjY)^(*?Q9tF!e%M%dV2TrTV&&Ua9|Y_cPW5WUPxiH1b6j_cX}a& z3{)Hv?44X5I`4=y2z5`F--LoueRrk!B?wg=vH$lC=`+{iLw1eS& zA{cg2w_{F1@^U~#`g=d1Muq2(ISEP5NM-{+BpT@e6K%N{k4rWt!rOrFh!EAz~=Ya_7 zci!P!?^45d&hV1q=-~FhTu#mHH)nXA$VASt2tRcjDZCEN_dBMj&jXn`Lmu)9>=|^B z!25q%$vZ3Ptc$Kg#e+*~%fJ;GJZ^inKr@`pYB0wb*-|3dJ^bBAEZ!=;Ri71 zXcGT?nvoUUA_2|{mP&xLf)WX+Hp%fEa3-SG_p9K6VDLIHs5Ie695B?jNFth2uIByU zQw?ZCZi{?~7st7Yf5l%=glMB`W0ZooMP6WvjRwVCQ3|;&a-UIJCrc0T9Ni~k&a%sc z(T$)SM8t9|_elT+;*us9d^X;~$|(p4MgdDN_f&8a;2fms*Wgh5m3T3Y!V_Im6eKe2 z-fjco>rpJV#&;aZrQkY`82u59aG3rYdgm%nEri)n@;JWy;RpjrUb!!kWe?Fv3KvE3 zDfZEoH+R@HBJT*c5~*-?PZEuKd_^7TW>%v7pC}*j5tc8XAvZ=f&U?N&e zSwyBAYl|WBI0)~8$Pb%3KsUA*C(_Vl;`Ny{QLbZ6D&vO zY)bxRh~LSOyz(XF^eAkkLVOSZ@H~WNlb{s@q82lX*8HigDcKKyG`41Sr5d}SU**6^ z5@;$(v%cj$Hf!E~2=em?cu0)ZDa`sjk+j67TSon_-{PsmgsJ&eeA#}M6`d34b(;Hi$w3m{{ZTjI*c~PBdl+SEz5l};DP($}%Rfld|^uvP| z(_&K(nS7#iu1E<fV>k63xA5DE6Q;L5dOf3Eck}{_LRn!JWiOVWaA4qN{yRaE&`5jxey#pp9t!gKJ9p&EZI(< zej?m92V+>&?`uey{iaWM5Sd7y#$Ji^>6BbFzhVoeM#h#)ygM#wAVK!jMe+uo>f|r^ zv;aRI%_vd*uotceM;ix65xDkh6Gxvr9?gA+@G3p}+tg@!6#A_w zQR&fEl(~sp1VxC_qkE$inI6>}rPs;Q0}Ph0;)zO?3&5y86X^rn zXf!<{5V9EYQ4;9%NWwJRW6~pojsl=TW~4_FtHTt*VAMZ7>O%p?j&YoP==6y2$t$~H z8>p68nLz`7o!;}N(rDW%?i-?5{Q?h;`v!$qpR~7$6Zd5=>~7m}pQKY!H7ccw`;y6_ zN!VYZ(YSv=(xvb-p(^h0Wl2+l6re=}j}!M*^!|8?cibmN{o}r5Km5tqnjH6eC}QG1 zV??CA4M*!>!m)9mL?;ywY09Q4I;pLXr3JsI~2R53hW+}GtC_X&y@_bq%(+|QoO zUXiude}^Si#{J*D3DpGXggE|alaK+FoWX6eIc}wKd~Nl-0wm!XzFE} zLHnUeB&Le{ii3{(f`g9xibYJ^FO)36d-xJu$Bp}GkHzbgiu-LerbgT+Iij~(WZb95 z&A2b%Xxt|_8utn67x#Dmku2Gc`#;-GSp68)3#BB?e&hb#L?+^X`Ygo#)3VY0iY*k> zg)HgBNNJt@%Dx=!jOJSdmz3(Rb{^ z+aP@Od*uz0)H^qQbV5RBLw7R05U*7tgZ~e6?*bS_k+lscfk03&L5)O34PN5~#XAVA zK^+}5(TGOD+p^vk@2CWESKP26nsFS>Dkxr;S6vs^8{ROo0s~?uDzC8^UtsZ*y;ojO%rU0qd(?>9tOuITQM!|@nSm5{eAk(hI%X(q18a zOUJxlW=m|XL}RH>gwwrs0J;U!Bi)7b57<*1Oz1t=@}Ah+SIkL&4cXj0WTFb_D?{Z( zRI#VbMT}w*wAds{z`sdydL&9(88Fr(lw;Uf-^1b2L1S&Ym<^E0SR1fn@=J~Ntf#;Y z#@b5-E=5qII%1!*I=az75nYCQ1<#!Kd@jwL-^F4p&AA0nP}0o#-J>8z@XbR=RSUnk z5Poq1{34bvhDPS%l*9&{lGq4mUTeEY`N}c2;=*f~-t&)FjpE??QMopDvMVBDyQqTR zf1-Y}wd2sAe~IdJIppsaPE0r2_OFXL|>hjp+!NhaF+kBnBKIKkL)Q0(SzRc=2}l>#mP4 zzuz}X*i}(}jusVggsYhG`JQ5}v@OSSgx7!pL|y1R!qYG8>6s8)S&^vhssI-54WD?L zi=ldf;1aVMPwA2^z~UioS!R4mTzWh}(f z8u%s@ts(IBo0qX)|3&MYb>5l8|EV#&^55ykaNZF?V|ZH~U2Dh3mN8rhG5a=#>-MmX z;nwWNaFzgVV>ln+UtkPuEzix+f;><5A~)X3enQ)miRn1I`$lv9y&zTluIBZ2M7#M-V>j$vynLdijE`*P|pw6=ZLsI~PX<4Ux&<*bZdhU_u%OqxB8 zMH20?UnYATdw9?u>()(yXKI3H!dP9sFzkrXbC#f4b1*2P9Q2as|HASjUBT2xm`ZKO ze{N+F7q|QiF4qzpYE=;+%SOdVJ?L zNFT)Wl)LJZ{c%!!=ODQRqzl~;{}_!+H+&K@a0v}voq0HHka?go`L~$-bx4=8C!%bP zf_N`Ha*#yTVOK^E-VP~XrFmAR#7Z~?S0kxPL{dl&^z%ug)h!c-Ang;|>5x+yw)Ug$)fEiR%jLa47 z`8-nhDP}#@@h^2GPliX8Hh32%21b=Nb+a0Axaz;8(ip0-TF@@nN&L;}XvQB_%^w)f zJr^_5>NP7q?#JWrlesU&-o~eL%LTzI5~lz+@;fUnxKH7ugIYBtJm==DLJqz_g#iiY3VWaJssjb6#zq=1 z|F1fn;Ej`Zd3{4&B*{;^4J^EN6fCnY@*KZ!hr6wC*MSiU?G2kmbukR$x>c^P$KPPp zFF41pdTX%itL>_{Vm;ig`uOY>Z4K9Nb(U(iLf}>i%y%dF!MM6vt8q6GceZJ0`@6RE zgsjksREi1M`r)PXub5RC``Hh}zp~iHQ172>LE6}gK#=olf_3*;Jye27wfM>%c^V;X$e0AEgfftYw?0S}jn zG^=SB>`W}W8NX6Erx83;5xT6L&Y7vmLb;eC z>@2rhi*X1whVxud_?YO4o^>IT;92LyBUA?x?y@rPM^bZKKd%AdZ2!6tr`b>wVzzCv)$YK_3M>&I9a=H)`EeBH?BwcR2R7`x0mXbvU>RB6bip9$v*NJXga9LRODgS zrUOftxTY7#=|I;CY52V}(=@y&q~VAA(D2>QhcvuZm8aq9hi23zl(k5{X(r0U-NXEj zVn%H(f-V+87np297Z3NQi!CV#b@8y#MLuYH(cRjWf;X+k7F4@-d&*N#AUqMA8heg- zqO*`BTK<{d|0y!pj8bTpUZ~AK%{1RR;b4?sw`!)W>-uMu!fEikW5w+JWh~YbLciAH%S837B3>nqF6Udp=ER1Li$gRGsp>Yf|5|QO}aGmsm ziR$IjY>6QiTju4Ms5u|*7dgV!^QCWYDx~5Y7wtz)_r4P?4L5O`;AQpyYN#<@$m#*=+sF*JIt>k~T&Y81 zo>khWONFtj*_B4CD$@Ll`G$=r4SS49jH|Vs4YLw$`i`ZNlw+RPiR^`@B{*yJmvz?N z;_-=k%-PSt69aJM$bFR0bI)*h3tlVgb+tH2>#F<`p(`Cx*X#uT0w!!U}+^STowv9BUAd>!{ADsaP6s0hzK zQew?)TDQj<3N7x3JNRbqIB1rTj!xnfP?16;gnJyuHC1D>P z(v9W1c=7y;G595H{Zz)B*lQKBkExl{KZ1QoJ>ZrtLmeY&g*R}6O|S;0g&_Qps~{-8 z7h;K9tm3LjMi$rMT=uALwK_toJXDY4bQLPf2}poX1Q})Fp;J-*YnzLr2V)P|u% z9gag(iDgk6eIL+;WgkJa?O3(`7&1py;R({Z%KdFz6lgR@ggn?4fAYM#PUDD1GcRF# zzdO0)n97aDd%N;A_)BC)|{J@ z7;@Am-gxq1j1qH{scwWk(}a=8`{}i+-A{*RGriuldxcO1&G6Sqb2arVtd^OEPcy^Y zWh&y16X|An*;CZiTNhAM7zsnB*iI{a`vX>6hr^cLcrCL~W<9I7u7VEPLy(Qkx(8Vu z7^KjF+%R+z)2~Ik6^42v>xSJytGioH#F!hRstQr5Zd1=GszZ=;cZReCgTeibW;=fB`1ja|pb z5wS?Ed%s-o8#)RY?kA7|g`LUAJy;t82myG?IUDz!BMDEf~IW(vb)q~M;ih={@~NWo4I2B6S8*> zcJF>-P2zHJRs3dY=Cfbo{y9cjA3876;8g@|1$@5Vt&kdpsr#X1!$Yd%UK+F$K8jP* z_tlA0-OKhjf`7_GwV;Q~L`3KT_r4xbD+*2AoNOG8w zy@1-rR7+*N1{Yq(`-7xPCOcj$iA=}K&ke;R;B7ekV$XY5v7BXCBt`a&i zZ8J*XHYcwzH@}Covfh-iH2~!Pv8}>@A_{CpxP1TG7vB{S49Y#zlgL%e?n0Szj)&35 zTFWhdvmy@(XE&nfbpsZ=K6n=;v@o-dU7Q!QHh-5oBf<} zDpc0UxEl4_DTst%E`OjCFe_(o&_2i!=_%h<^fRldv^$1H1Kvd^;ytfJ?Gs$-w72MR z5}mzLousHEKdo8gcT2}dnJ@CeR;*5%!L>NozaC6?pozZPJGw31%j1Z$zNCyM>MvlI zM{#Qrg(J+BThZ8%!+UZefavjG*HBwr3Du^PR;FIQ7ab+Z;J)p6?eW_gs_Z=959kE* z2Vkr)P?dWD2{i^h9zujjDuN^)fAMEZwKb?3F?0v^X!aL>Zm&l%4w9iE6dTEEx5;oL zBEfPr31PXSj=;%Z@ieRKVZL0UjDktvk*zLJH^nif#v`eCd9?7cm9YqR`{Jew13J?x zBn^i&$&SUyYBPhXY~`zdl=MyF&<)xl9E|L0-eT{Fu#6_6GhwprrqwQd2(89!?y!zk zRVj3mfd)w049RGckV66+v%S-mUccRDB#T-dvr#@7#;a!XC#FkXOsM68k*PouVn^Qm zrf{!T1z|3#RE^$M`PKNi`a#M{Y7_JGYKih$O}1IF6zpt(Z_rAbk7=^Lss^`Ci)F=v zb>g!b)=O;qc??)ARkhPt3qEN^w4A0H-We%7?44N6+E{hF9V%lRBorO5TnhzuX&FaD zODF?R-SHqhCYq92#9RMXi|w|jBok3sFwS?M`czHFE~8wXbyQ6c*q_c;GE2jfn``ez z#qbsTpkR-px|U#wlp;>NmO9uyvQ}^A$PMP|YKfYvRZwJNa89gsckYUpFD7A~1dWY% z?!l>iwAE-ZTWNkLR&|cctzBSMY;TmyqI%;tE;F~O$^>m7MPePEdxBUxRt0#40u`dj z@^L<7oCh&^=hP>!;xx@km7fD~a+K3lKXocoX(53|yL;Q$tKo*csRc6W3iyt!SVTdAb|&B89FFa3&EYc4^7zQyMwr>AKJrN9-+ZbLdJFdf zEV%Qbh}%a1|-c%);tATI128ZDx$c&Bc()r)3P(E2Tdh*_^ z6)>)}?YL{FEDJF6Hqy%d8oh7r9ODXcjmqzU0{=u>oNAzjN`fu%$aIO{14l@_s8hdL zjWQQAd`jfsH%W#2WTXH-5&@-3rJ1S(g_G)HLsbVV+@5J}?@=ZTk@Sg4O3ed8nzGDo zO8Jy^u)kbf66h}+Cre-=4jA2G7+vEr8dVYB1ic8EOX%(O^7>kHS-AM-dvIB}_;u`& zb_y3S=DJgP;o|Qn#JZvD@jb73rUW+(YF)wU+0?&&2j8og^!y|c+KkZH&bQ*hZ23?= z6?3A&tU;1hBv~H*yfb8&aGY0%GL)&q=WS8k8IH4D?@Ms+eb&3NIvV>_svN6<4d9&? zyc=~S;(%1-X9$tg@g4retABQ%71QmvM{`^8q&QP5W+Y7JmY&?!!o@}LO5U_Zb6c=$ zXY|U#Ihd*j5R4j*$-t>_aWpSOa@|+Cv6mW(GUPOu=jC?poiQU915SDc%CR)Sa-HehtLy`TRiF^8Is$v0Zz+WYTPhRV?!@JZs`4(ObU zB54AuJQ|nNIIyaw4Wf7XlBLs;T^Sn0^p#QfASiir)J#{dV7}oJmybC|<2Nh4@^sIk zOgRe=Vx)3SGA8G!V0m26Q&D0BZngJQRJ}#`#;1sAh`~Ct4K;_aG;`)<+YymQIH z3ff6I$6DmB7ABq(ja5xDY~oeZ%~h;win&UaPY1bM5NccssZrxXw`efFy0fRJxt`7K z;#`mEo-%+SUS=m#|4LEx?bW#V3gtbT3YXH;c^g#x;zRaFx)dwn z`1qbyx5S`RKL8_#`g`Ldk|@UW?psN2QEp271aiFkYrTxGsJupMu=)gTyTPs~D@UdE z;70O?P76HSb1sDTI!=_4+9ao(1eT==7nc`t4P^IV*5$}TqxqlO=oIZ2&iRafFOh$g zk>c8!xaD?`en3yFh?jb$;;dKYf#DZBd9Y(5US7a8xev$pV2&w@KpP^!(6ue>fN=#* zIp1If5t0o>e-5um9%R8*116@060YH%4E)}V4M`T{K|r8-%6v1PFA(wim6puq74b3) z{yV_&K-Wr{ij<1Pv;r%sn#JNX>G30X#y+2l*w<32w=Bf|MARimMPv1&v@ggH3jh2s zq;(yQo4Os1UdM^fO7PLXk0)W8KAJod`L7+X6&T72i19|%cqLy(oSxS#>QhLasVi-O z5a>#`S`yD51*}M%awdbWb6YF(9L+?mopR0-rk)M$#w=r}=G%tmlp`Gh_r$Q|%U~Jg zG031#yNJ#|k^dc@=#u?`Gsuq}6Wv+^cEcV+Uc&-di#znmBXlj9!ymH@GF}V+oTCp- z*pp+8y!Y7%7Ho!0`!<&w39rcS*oEe=%#=FD1xY1dlbLvb5c4HLk8eN*m^K3C9PAIs z$r+CgBCM=DR3Xo}3WO(#s-(lV2NE3%nsT4>4vDVwR>wX&AMLRp+JpXXf&9TW}~WH zp}^-6@aeb?X5y2>`oP7Dj#wP{aJWo(@-XC?3z{JKcW*$=(W zTO3raAaySQ%~&P_5`IF@Rrx$Ia0T7(?Dca@{9o7{}g$?y(Cvd$S5tDiyuUaJrs9s#@d zA&QzC#GVtt@~AnrCBaS&Vy6bM{eswWLF`4q;tNOkyP|z_>`AX@K`Yt^55gt+tY{xF zsCCnN!tfm({7u!Lj=!vY$141Z%dN&pE8h4x*1D6R>N&6zWuB(uH5E_=R7`EYyf+g0 zJv-(WF79?OTHK3P_X2wx>gNMAUgqXb8)^|xFaeK6_*a@l!Vjkv&-Lo0VQ@AJGe^mS z(Db2o0zw?dMAo2Aga?XM8di8CcIqH3lm_V^oxOA>QhU&y3$NXq@uF=X6n@=E3ZHUv z_P}pbzg@N}7+6ryKf0v2xL{!Mz?};);3vTWA0ukvPgB9L0{Jhxq@ZBu;sFD<8U{qG zBH9$8fC3|A^>PM7JPzE*U2OMVAcQf7r17aR)@smm)_2f0~#* zaM-Yt=n`ZO+<#yJ475A7r}dJ@En*qY3hm_d}#>*Wg1n9A5^rvQa`fQ9f9qm>f;E(+*x zJfg{R)$Cj%MCSkrTObiHJ)$Lzl2|;_qua&M9VB#90mclQbiDNG+LZ1`?8sIjzmltF zXTxq3@*;rqm5!G_9Tf>VU-0Ob8oFkon+EUzrQ@YfH&yBW2~+%Mi{#7h3;yA2PqvdeLAf2uzuft?&{?WxoUPk z+m(8$1$YysiiROoI1c!<*R(x=0tV$$v6(QRkw1_)gvz?&%@FMT=*EE2_EVTPvm z(jiyP&MUi6FLMDdR61VzbX{8BQjhLwLwBpt%?B9a3-!WFpKdg)7IMZsy4i;AOrg6A z;Gs&#OP{V*>8d@tN<+7+&@BLXbEV^@PuHS!BRsmT4c(VJvwrsjyoJ*7(x=1G8I<#j zPhGuyDp$?UVxe0I@Rmx)OP_9%(mm_ZJ#Of(5xR!~E>=2T`g9AFuHK`YW$2C)xSvO`gAjuu4ApM zmyhJC*||sPo&$JmrQ@YfmsGl^J-SB>-FZTn1b7>zW#g zt8~2d>8g~j(xZzQy6<;n{aOGXu5`Tg>E<|-x>9(5)NcomuGr8u3tbn$M=2dIeY&Yi*ZGlKzmMdq*||~Zz6JPbrQ@Yfw@B%p z@#r2gbSDd4H^E9Lmu@hzq+99gJi4n4-S$HFGw3EL9WVXz%K3aLQGC2d7cq37!MsxS zIf#0WQ954wbPY3HeWwJP1`?XF(lm#b!HhR_uNT%mNl^yx}4 zDniaDJ-P=C-JwD^7~o2!fjrQ@Yf*QInrJi2~{?pC2I0k}%(cc{=zeSHzJwb~)$a`OiAu*ypRNee0^}U)(d}#K z77JY&z$YmkFMYa6O84BmZvB4zfLG1VHA1%+z|~5}OP_9m(xn8=;QDz(ca+eL0{CR5 zG;8T>2mp)1EL-#g@g;f1$fDcqUUix%1m2RX* zx09i}N9e`@JW1(z>C+{Z?uYkXy{wn3X6HPiD+hS8((%%#D?k)QZFqF|8M?iN?nr=7 zRXSe!bX7{1@aXCd-S-$SQ}t1RPg6Qx`gHS^Zn8&rf}vX`bQJ)fu5`Tg>DrZU7msc` zLwBvvRRMg4((%%#D?_x0`hB&=)k}w5H9N-%-F$%0R61Vzbkme>sYiFIq1y^{7!^48 zl0&KwBegrp=DPwFvCk@E>nma(Rm3{Y@r>nvBF)`0Uz`1Wld#t5-k9gH8NaSG$_@5+ zAwcQ;47?Xm63kqW{%!-NqV^jcr*~HCiX)x{^u?}H*j2ZXShIfk+P^mR zIIDla{p?i>5vzvY!{=Uw(Rgs*f=z%)`{}dp>uYfz(c#>bIBKZ}OIfL1*E5x`=30q2 zNg|KyO3DiccrEu;=dMPfZ^MqYcI04(fGiWOKr&XTu~!-#u-#1p4ARL?>Q9i{h^)Xa z$PM39ae-Zs_B-0Jht*|R0mi1LXsk%yblEBz&#%P+AW?ZKTgru6_~x~}H`0DO50!L> z@3~L13HA`)KPh`HgL{(j5C+>nVrDOd*`#q08$8B0!Lda^PIIM%vTv^wRkEb<-USc0 zi0p$*Ior&o#c}ryH~KC+5H*8AJ?y38Z6fPhHnDi<0_p+iOKx>};H=Pj{`EVzx!2_V zy5YTWzMGnI4&ZhC476na-%a+PFGo^ryPbKfIk%gfchTRGvpH_l8uCEt0d_<3rJXXw zU}^QPZ{@CBi2Wksp=d&GFUYwdXS^(jj&JIZW|6OUFX_V7vYcF&nsSPHfB{~}lxN@a zpk7It_XwU~{hiHe*fDMWirgIRzs2?(Y+~F}c4AB~>m1>)(7R$Z1892KrQPUZ7qG{r z*<@_i&#{{Bx>-Nx7S`J-1BvlUaTmh71tEAWXK%&R`8*5kt~V9qy~hkQ)Ahv5}46Ab1$A0uV) zk82yd8_d~02D!m{4KkR+1jB57c)}}JhaIC-KidL>qJP@k?SgHRK_B?fW$f!IXIGp> zgxhyK$Wjlo&vJ$IQ^>=H=_@jt<^RQ_xW%J5!7zR8OJVv)57M=dcKt;D;fCp>fLMdW zGP)3C<>WYxcqQL|VY4?zzr@L|zaPt63HD+&DUKg|kCL}E4^VUqmH?KF1d;-M1%X_60tzBrF*3aW6CAKl zf?LERYZ*(t>KuldZDuM@{Mu93bR{h_8i7FkmlS=Ybw5x-#>oBWJz z2l8h~`y1GMP=?noit^u;OPpf9vhbwm3-@lBu@82%^8jhQ-M~Yoi*`u~0-t|d*)pK; zq}AN|P+0w5VcE-tC$9h#P-ZLUD!-V^`z&UPAh6ATDh}xuv#QF!mdi}<4QXF zf3+cSuCFm{?Edm)15v4MmDsH9$YeJLV@}AyhFvBY-G;^`o2aX~A>IT4`OXdaVn;Am zbo&|i7igeq^{*zd2?|goeN%ubhp|dvZ@Ng0ze zMqld^=Lq3%g77%Mma4>aKkWILmkiQ-Eu!iZor5lO+n_yChJLJG8TOgs4}1oPxBHz8`zu8xr|glP%>Xtl7V41 z)+ucbXGcDUQa29y?tjYDe^Y={MQpA|o3*pX)flT}3jCon5n>=2u4)oJLpwIi6%cZy z52>T1!7(V@5Zv*WwY9-*ODx0omfxgR^jqK68;p$7tWsrV%`dI!o&TGCl%JJ{-vh|3Bkx^tQ4+)T=^z{aaPuc*_#cpsKD}Mu!V2Za^`~q-4|US89R~N;Bej*;9lXQ_JeptlFs^6P^@NeiNzc2om|E72S?b=6vZ~PJJ9x&m}ko2BUqs z=^5C&%bm*2$cyJE6_J$hKN>_cqEYrC+2l@7!&fc9;h3LgtilPbWf=Iio4NbDjh~Gd zUpk^+POK^_ebC0An#f;yQ(MTiT|_U=DmTcRbrYPn zB5$~uGum&)ZAGj@jt1n*ISyy2jaa8I3q76E6Xs!7*25I}=$=H%C>h6?daNN#%0W;J z)*qYL`8eD`2FA|i_-!Xb_D^v|=tE~Y8jr=6qF8GVlWu}uiZ{}`PiP$fA&_*C#M6j1XE@Gh%c-iF5CrJF zHnXSv@}!SXb0VL!^hF=anwBV+56Q5Krdb#xFhl*&d43F(YQS627^z|Z%!gh4`WVoc z?{OL@nmGc@okKwsnyo;=fm!oxe(nIBZs}C1)YDV&6KiRhcRGF>qgCV~;K^;I%!WzK)7N4Ix-DExeBRZlv3>yoXX~$&x-X{~ z&hWRuDV2Z1He6VMSc&|%mg)laS??exmOmCb(Rls={HagYjK#j^Nnob0Y>oteiHlzY zJf26H+Y|M6XR~;HByZ#SUu-RGrjHA-*}Ed1{|0liRmrH#EPE{f2zyPOJm_Fq9v-1D zuYyx>_Q$Qf^}w|jd&%i1WCVP7kvB%f%gcnbXA2wNrj(q=xoc}wxy=4Pfue+eR$gc- zSOAGVqE}GsOdfUl$Jn*xlvBep$PO3X%VjA|WLZBn$MQVY@+xUHcW2op*`(ZVXvT) zohKp3Eqy5yj!?t^it{iN_FG2L)PU|}!U#>E)Xw!xD6*Jdg@i^COVksq8Xl}qsk8^{ z6RURc&86i7QM|L$>s+aid@ftI;D zF7ZCXCfYy5=NFgr3F_mPbK7$)=Ux1javFX~Ioaw_XYoH+`0wlTFSGe)(^EFSds=*V zQ@Qajpvc_{|K;2nv`=@;AB{$B!HAaxU+A7MZ^9AM0AP^Osgf$b4Cjw94G4Ibq3W5W ze}7Fo!gdVFl$Ue0-@k`+lEda{<#YIEqIaKPGk7_jva|M8P#;C=c=<(j-ML7|#^4-h zHPiR@(({nc^I+tYI=X>M-e;UFIV@k(a=f%-k=BV}fk;2~Kq4j0ryhZ{+F5Pno3lI6c^;2}f@WGjFYOyh z0lv9GtYGr=EL$rRl{$zN z-%BK1FPg_;Ff$LIbLZX?+{VSPI_$pd3MNj?-7+Uze&+feRf$VJu) z9*|O4hC}VpDL5W1&nZW=p&n zgZa7@7NW6)5~T9UTt7Sw#Vf<+E>G@S%pKwZh4V`$!5}kc%nJgwe zT`E8GO5`U|gr78LQ7;&?$l1Ox1A+R{g0HXQ557vGca!u^S=LX%-LtH^HT_HECm++9 zZ`lhpR^=1dA9SxdmrD3&*r%L7iXAF{92`XcL{<2xB{Ya=d`N8pT%bO6Ju39ur}$b;>!dnH1dVStjC1%sE5Y)JIup-BSMK)NIm(7VYWi z=a-MQ1wm*hIE(V)I1SQ3f-8Q)FSe_j+b!WJI
IEsU5an*ZV^lqfT3P(FdvAV$g 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 literal 0 HcmV?d00001 diff --git a/art/car.png b/art/car.png new file mode 100644 index 0000000000000000000000000000000000000000..5341b13737c5aa30609a603a411650662c6ec0bd GIT binary patch literal 36508 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 gcHNLeJw^?oTd&!F!*ckBVgI&ba-=bZq1uCb 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 Y0-2COfY$1;GXMYp07*qoM6N<$g5oy1@c;k- literal 0 HcmV?d00001 diff --git a/art/grass.png b/art/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..32120250f6d77c8324566839524ae6688796d11e GIT binary patch literal 541 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
4e%znEBbK%qL&%?8RWp7BG}660FPqGmPT;k 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 literal 0 HcmV?d00001 diff --git a/art/start.png b/art/start.png new file mode 100644 index 0000000000000000000000000000000000000000..20dccae056b7ceb389657cd1ac384bed0080ce2d GIT binary patch literal 3141 zcmeHJ`#0NZ8jps?P+?rE)lkz#4Kpl_JKdy235nGGQt8@`x{V-$ic6&itsS(}YSpcw zH0YMDK@b_OUfjiPbVemc($=NEh{Q$+--&->&)Ktm&ij1c=l%TjoX>ea&v|bW@aNT3 z^i&`ah?=K|n=b^SK$j;(87gP`#J+j*OEC(KLqj0{E>V?5C_x}l2*KMQBj*8xkq}`7 zAP7PP0YIc~VvQtNBPrPkz!HR50)R~wVpBzAf`m+vlI70|q5P0505V%hW=qQmvND3C zELB>Ty3a}l2jQYJwxotLPQLSVu8o_8>XJIu(7bWbIJ*aKwwRtZfO6jL||4m zcgpRU`vSjkh?q`KOtYk&0dKR={NR>z)#oyZN?K{FxYY7HgxB)K49QYoxT4WGzy7mxepTbBi+y#P@ta9jh|=wab4#@vB18ooBx-Q^D$<{}u67lQhV z9(!)LpKap-B(3;G-%nF?s9LYywHD8f=visPJCZISNa4ZY8j;l z%rOG61&HV)>K&o<{M2p1xAiYoDFa^RDs6Xbgu(YIhqF?M<2`UY|l z?NqshnqlJTaQ#G$>f0End(j0x--}TCdT!d)S*ld(L~;C0?FKKc*gS4Xr2)&;hl5r_ z)+)e%sH$WX^^1S|E=tSPC%3w$h%-qs%&sY^vbNVKg}zWY1kAgD{0koje`bO!%#JOS z)zJaFZpkZK^)@gRdgGV9^S$i)b99g*iHX-=a;$cK`cFysqxLz~9S%oa@L}-7a4#k3 zK8HS&_+3CvZ%U9LN0+jfC>Wa9{@uWZ>PS5cTiHgRpBG-WmqI@VB5OlXCle`$t>j=1gx{gi4i!-yC}Sj?rc6+{H;# z{#jJGIRB&#f8}jw@{zkL@j4!H7sacL2Oh~HY$T7-Khm58r#wSW&%PdROrU=JsI%VE zR|k+?EidMdCurKjk*5AxMrNnWD}q87RtiS4@GG#{Yui@5E4`yU$8mt@7po1kKGQ5xr0sMBRu}IzH_PUXtQ#%s4%Vn*Vqjqvs9h3YR-2vfmYS}Q1-fuDDRDH zhzl$52R0VEOZ*_N!y9F7)p!Hb&g>egj=Qx>OIu%khF9F2{rKxJZm9s}y1OozZk^8^ z8#Ql^EA$N&aPxGV9?^2(r(o7P0ZENb-p`^m7?=d?*hN0*_K5oUKpvAqMNB3t0_*dgON!Sb13!&mWX)pNz4WCUEpJw0 zBtOn{66rg2=Ikdhr6%n$!-@Ri;j#8-eYi1mW?vB#fHiTt`H|5AlwNlI+q#TLkAXnb zdXVvZ%Cw#3OFP||cM&USL$-4zrnt_F}?mm8a_`!>o2B>1K4-g)}-6DSx_U0 zIYM(!?lFeiv?ZHY`~4KMu#)^p_EnUz<9pQQ;8$iez1f8=uXs#>?$WLM9VB`_ytei) zPL~~Tc@!{fwUp%B;*kEv@p1TR$6Hzs=?B|_j?Rhh*910>b{v_mLA#ZY4=yiboH`sl z=oYw!dIbxw5^fEnK;f|71O$d$IzD^VyQC-$PTM@Fw==5}=srI{UpQz~eun>54Yr`+ zd6%3tJl`1|E<`BT#q&`fY}E3-T{;r?kNe@qvhNX%gIq2cXtfl)XJ$n?_-J`z@NUiL H{(k*WELt!I literal 0 HcmV?d00001 diff --git a/buildtemplate.html b/buildtemplate.html new file mode 100644 index 0000000..7e6698d --- /dev/null +++ b/buildtemplate.html @@ -0,0 +1,75 @@ + + + + + + + + Emscripten-Generated Code + + + + + + + + + + diff --git a/co2.png b/co2.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a48aaf3c48d221fe2ed8819183783a141a1057 GIT binary patch literal 5408 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 KMNUMnLSTZ5L3sH9 literal 0 HcmV?d00001 diff --git a/dependentClasses.zip b/dependentClasses.zip new file mode 100644 index 0000000000000000000000000000000000000000..207b66d6b7f2c7de8a42cc97d22b16a3effb9890 GIT binary patch literal 1290 zcmWIWW@Zs#-~d9y6pv5_D7XrwIT#ceauYN2^pXn-LPK~N*z>nICfk>pC4=bF3T_5Q zmKV$n3}7Po+!^n4n!cW)0iS$zE}RZ{6x7De@DUx-0`MBNBeAYOa{?} z9REn`^m(5^hN3lVyuc1xy;G!N!2%8A^(wy3CzVar)#X)WCof-;c{cR)QHYzkDjqV~ z18oJ_jBry%G9p9^fHJI5H)Vi>^DEFbAwVpK#YK7=UOwl2Lr$Fc_Inxx3)>BvdY&iG zTtB_x@guKuo;rGA949>2_~>qGE36gfUIlieiKe>oO|CO+j2%{MnX-3yMAoHsIeBIk zcD5}u4PR>t4!G;pYvM;R3ofASbahwFn-B20(`f038gXaRwn5 z*iDy!NdOXx4IkFx48>JSYW|*=XRV&r%?)M}?` zeh0cK9Ef?axQn=e{NSszp=~2`k&t$9H(Ee0uv!~4A!>#Lwvar#c5+}8&_y6u1$Z+u zi7+E_5^^d9xflkvG=f;f<||}VK`9(LoqI`D;vl~tU$O1 M=pGMXF~-0E0Ln&V4*&oF literal 0 HcmV?d00001 diff --git a/diff b/diff new file mode 100644 index 0000000..68dbe45 --- /dev/null +++ b/diff @@ -0,0 +1,14 @@ +1114d1113 +< void SetFPSDisplay(bool display); +1176,1177c1175 +< int nFrameCount = 0; +< bool showFPS = true; +--- +> int nFrameCount = 0; +3203,3204d3200 +< void PixelGameEngine::SetFPSDisplay(bool display) +< { showFPS=display; } +3543c3539 +< std::string sTitle = "OneLoneCoder.com - Pixel Game Engine - " + sAppName + ((showFPS)?" - FPS: " + std::to_string(nFrameCount):""); +--- +> std::string sTitle = "OneLoneCoder.com - Pixel Game Engine - " + sAppName + " - FPS: " + std::to_string(nFrameCount); diff --git a/dirtblock.png b/dirtblock.png new file mode 100644 index 0000000000000000000000000000000000000000..af8bd9194d19cb226b0ebc392c2a80044008ad90 GIT binary patch literal 35629 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 z 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..6ec6d15 --- /dev/null +++ b/main.cpp @@ -0,0 +1,1135 @@ +//-------------------------------------------------------------------------------------------------- +// F4 Racing +//-------------------------------------------------------------------------------------------------- +// This is an advancement in my game making skills, building off the back of my work on the "Collect the Balls" game. +//-------------------------------------------------------------------------------------------------- +// created by Rune +// black box code by Sigonasr2 from the OLC (one lone coder) Discord server +//-------------------------------------------------------------------------------------------------- +#define OLC_PGE_APPLICATION +#include "pixelGameEngine.h" // used for drawing the game + +//-------------------------------------------------------------------------------------------------- +// class +//-------------------------------------------------------------------------------------------------- +class Racer : public olc::PixelGameEngine +{ +public: + Racer() + { + sAppName = "F4 Racing"; + } + +private: + float car_pos = 0.0f; + float distance = 0.0f; + float speed = 0.0f; + + float curvature = 0.0f; + float track_curve = 0.0f; + float car_curve = 0.0f; + float track_dist = 0.0f; + + float cur_lap_time = 0.0f; + + std::vector> vecTrack; + std::list list_times; + + bool bothKeysPressed = false; // checking for dual key press; could probably work with more than 2 keys + + // custom control template + olc::Key Move_Up = olc::W; + olc::Key Move_Down = olc::S; + olc::Key Move_Left = olc::A; + olc::Key Move_Right = olc::D; + + std::array keyslist = { "UP", "DOWN", "LEFT", "RIGHT" }; + int configKeyIndex = -1; + char pressedKey; + + int cup = -1; // for cup selection screen + int track = -1; // for track selection screen + + int player = 0; // for car selection screen + + bool start = false; + +public: + + // Menu Setup + //---------------------------------------- + bool activeOption = true; // highlighting current option + int highlighted=0; + + struct MenuItem + { + std::string label; // label + olc::vi2d pos; // label's position + std::string label2; // another label to right of label + }; + + struct Object + { + olc::vf2d pos{ 0, 0 }; // the x position represents how far to the left/right it is from the center. -1 ~ 1: road's range; the y position is how far along the track it is + olc::vf2d size{ 1, 1 }; + olc::Decal* decal = nullptr; + olc::vf2d offset{ 0, 0 }; // how far off the image will be + bool rendered = false; + olc::vf2d drawPos; + olc::vf2d drawSize; + olc::vf2d drawOffsetPos; + }; + + std::vector mainMenu; + std::vector playGame; + std::vector pickTrack; + std::vector grandPrix; + std::vector selectCar; + std::vector controls; + std::vector gameOver; + + std::vector gameObjects; + + enum class state + { + MAIN_MENU, + PLAY_GAME, + CAR_SELECT, + CONTROLS, + RUN_GAME, + // game + TRACK_SELECT, + CUP_SELECT, + // tracks + CIRCUIT, + FIG_EIGHT, + ARROW_HEAD, + track_4, + OVERPASS, + PEANUT, + track_6, + track_7, + track_8, + track_9, + JX9, // special track ;) + // cups + INDIE, + STREET, + PRO, + GRAND_PRIX + }; + + state gameState = state::MAIN_MENU; + + // Variables + //---------------------------------------- + + // lap times + + // player + int score; // score at end of track; based on final place + int lap; // current lap player is on + int place; // current place player is in + + olc::Decal* car; // initialize car + olc::Decal* hill; // initialize hill + olc::Decal* grass; // initialize grass + olc::Decal* road; // initialize road, curbs, and finish line + olc::Decal* banner; // initialize banner + olc::Decal* title; // initialize title banner + + std::string KeyToString(olc::Key key) + { + const std::array keyStrings = + { + "NONE","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9", + "F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","UP","DOWN","LEFT","RIGHT","SPACE","TAB","SHIFT","CTRL","INS","DEL","HOME","END","PGUP","PGDN","BACK","ESCAPE","ENTER","ENTER", + "PAUSE","SCROLL LK","Kp-0","Kp-1","Kp-2","Kp-3","Kp-4","Kp-5","Kp-6","Kp-7","Kp-8","Kp-9","Kp-*","Kp-/","Kp-+","Kp--","Kp-.",".","=",",","-","OEM_1", + "OEM_2","OEM_3","OEM_4","OEM_5","OEM_6","OEM_7","OEM_8","CAPS LOCK","END" + }; + return keyStrings[key]; + } + +//-------------------------------------------------------------------------------------------------- +// Create Game Objects +//-------------------------------------------------------------------------------------------------- + bool OnUserCreate() override + { + mainMenu = // show menu options + { + { "START GAME", { ScreenWidth() / 2, ScreenHeight() / 5 * 3} }, + { "CONTROLS", { ScreenWidth() / 2, ScreenHeight() / 5 * 3 + 64} }, + { "QUIT", {ScreenWidth() / 2, ScreenHeight() / 5 * 3 + 128 } } + }; + + playGame = + { + { "TRACK SELECTION", { ScreenWidth() / 2, ScreenHeight() / 4 } }, + { "GRAND PRIX", { ScreenWidth() / 2, ScreenHeight() / 2 } }, + { "BACK", { ScreenWidth() / 2, ScreenHeight() / 6 * 5} } + }; + + pickTrack = // show track options + { + { "CIRCUIT", { ScreenWidth() / 4, ScreenHeight() / 4 } }, + { "INFINITY", { ScreenWidth() / 2, ScreenHeight() / 4 } }, + { "ARROWHEAD", { ScreenWidth() / 4 * 3, ScreenHeight() / 4 } }, + {"Track 4", { ScreenWidth() / 4, ScreenHeight() / 2 }}, + { "OVERPASS", { ScreenWidth() / 2, ScreenHeight() / 2 } }, + {"Track 6", { ScreenWidth() / 4 * 3, ScreenHeight() / 2 } } , + {"Track 7", { ScreenWidth() / 4, ScreenHeight() / 4 * 3 } }, + {"Track 8", { ScreenWidth() / 2, ScreenHeight() / 4 * 3 } }, + {"Track 9", { ScreenWidth() / 4 * 3, ScreenHeight() / 4 * 3 } }, + { "BACK", { ScreenWidth() / 2, ScreenHeight() / 6 * 5} } + }; + + grandPrix = // show race cups + { + { "INDIE CUP", { ScreenWidth() / 3, ScreenHeight() / 3 } }, + { "STREET CUP", { ScreenWidth() / 3 * 2, ScreenHeight() / 3 } }, + { "PRO CUP", { ScreenWidth() / 3, ScreenHeight() / 3 * 2 } }, + { "GRAND PRIX", { ScreenWidth() / 3 * 2, ScreenHeight() / 3 * 2 } }, + { "BACK", { ScreenWidth() / 2, ScreenHeight() / 6 * 5 } } + }; + + selectCar = // pick a color + { + { "RED", { ScreenWidth() / 5, ScreenHeight() / 3 } }, + { "BLUE", { ScreenWidth() / 5 * 2, ScreenHeight() / 3 } }, + { "GREEN", { ScreenWidth() / 5 * 3, ScreenHeight() / 3 } }, + { "GOLD", { ScreenWidth() / 5 * 4, ScreenHeight() / 3 } }, + { "PURPLE", { ScreenWidth() / 5, ScreenHeight() / 3 * 2 } }, + { "WHITE", { ScreenWidth() / 5 * 2, ScreenHeight() / 3 * 2 } }, + { "ORANGE", { ScreenWidth() / 5 * 3, ScreenHeight() / 3 * 2 } }, + { "BLACK", { ScreenWidth() / 5 * 4, ScreenHeight() / 3 * 2 } }, + { "BACK", { ScreenWidth() / 2, ScreenHeight() / 6 * 5} } + }; + + controls = // customize controls + { + { "FORWARD", { ScreenWidth() / 3, ScreenHeight() / 9 * 2 }, KeyToString(Move_Up) }, + { "BACK", { ScreenWidth() / 3, ScreenHeight() / 9 * 3 }, KeyToString(Move_Down) }, + { "LEFT", { ScreenWidth() / 3, ScreenHeight() / 9 * 4 }, KeyToString(Move_Left) }, + { "RIGHT", { ScreenWidth() / 3, ScreenHeight() / 9 * 5 }, KeyToString(Move_Right) }, + { "DEFAULT", { ScreenWidth() / 2, ScreenHeight() / 9 * 6} }, + { "BACK", { ScreenWidth() / 2, ScreenHeight() / 6 * 5} } + }; + + gameOver = { "Return to Main Menu" }; + + //---------------------------------------- + + car = new olc::Decal(new olc::Sprite("art/car.png")); // load car + hill = new olc::Decal(new olc::Sprite("art/hills.png"), false, false); // load hill + grass = new olc::Decal(new olc::Sprite("art/grass.png"), false, false); // load grass + road = new olc::Decal(new olc::Sprite("art/road.png"), false, false); // load road, curbs, and finish line + banner = new olc::Decal(new olc::Sprite("art/start.png"), false, false); // load banner + title = new olc::Decal(new olc::Sprite("art/title.png")); // load title banner + + //---------------------------------------- + //---------------------------------------- + + // may need to separate the track list into it's own function so as to declutter this one + // especially, given that there's a bunch of stuff going on with the tracks with much redundancy + + // JX9 track layout + // javidx9() + { + // these happen to be measured in meters, as per Javid's original construction + // they'll likely be wonky for the game as it's not really modified to fit my units of measure + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + vecTrack.push_back(std::make_pair(0.0f, 200.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 200.0f)); // sharp right + vecTrack.push_back(std::make_pair(0.0f, 400.0f)); // long straight + vecTrack.push_back(std::make_pair(-1.0f, 100.0f)); // soft left + vecTrack.push_back(std::make_pair(0.0f, 200.0f)); // straight + vecTrack.push_back(std::make_pair(-1.0f, 200.0f)); // sharp left + vecTrack.push_back(std::make_pair(1.0f, 200.0f)); // sharp right + vecTrack.push_back(std::make_pair(0.0, 200.0f)); // straight + vecTrack.push_back(std::make_pair(0.2f, 500.0f)); // gradual right + vecTrack.push_back(std::make_pair(0.0f, 200.0f)); // straight + } + + // all 9 tracks below are running on yards for their distance units + // this means the end results are in miles; rather than kilometers + // enjoy the US measures of Burgers per Freedom Eagle + + /*{ + // Classic Oval + // Circuit() + { + // 1 mile loop; 1,760 yards + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + vecTrack.push_back(std::make_pair(0.0f, 270.0f)); // straight + vecTrack.push_back(std::make_pair(-1.0f, 330.0f)); // left + vecTrack.push_back(std::make_pair(0.0f, 550.0f)); // straight + vecTrack.push_back(std::make_pair(-1.0f, 330.0f)); // left + vecTrack.push_back(std::make_pair(0.0f, 270.0f)); // straight + } + + // Infinity + // FigureEight() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight); this is positioned somewhere after the intersection + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(-1.0f, 0.0f)); // left + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight; this crosses the first straight, to provide for chances of crashing + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + } + + // Arrow Head + // ArrowHead() + { + // miles + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(-1.0f, 0.0f)); // left + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + + } + + // track 4 + // ???() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + } + + // Over/Under + // OverPass() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + vecTrack.push_back(std::make_pair(1.0f, 0.0f)); // right + vecTrack.push_back(std::make_pair(0.0f, 0.0f)); // straight + } + + // track 6 + // ???() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + } + + // track 7 + // ???() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + } + + // track 8 + // ???() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + } + + // track 9 + // ???() + { + vecTrack.push_back(std::make_pair(0.0f, 10.0f)); // flag (straight) + } + }//*/ + + for (auto t : vecTrack) + { + track_dist += t.second; + } + + distance = track_dist - 100; + + list_times = { 0,0,0,0,0 }; + + gameObjects.push_back({ /*{-1.5,track_dist - 50}, {10,6}, {0,240}*/ }); + + return true; + } + +//-------------------------------------------------------------------------------------------------- +// reset game +//-------------------------------------------------------------------------------------------------- + + void Reset() + { + car_pos = 0.0f; + distance = 0.0f; + speed = 0.0f; + + curvature = 0.0f; + track_curve = 0.0f; + car_curve = 0.0f; + //track_dist = 0.0f; will need to be moved elsewhere; the game will calculate *ALL* track sizes at the start, and then simply use the appropriate numbers when loading each track on request + + cur_lap_time = 0.0f; + + // Note: the following all need to be reset during the process, when they've been implemented + // -player position (on screen) + // -player position (on track) + // -track section + // -all lap times + // -score + // + // if called from other parts of the program, other than the 'F1' key, it should be resetting to the menu + // the 'F1' key is meant to reset the player on the current track they're on + // + } + +//-------------------------------------------------------------------------------------------------- +// main menu +//-------------------------------------------------------------------------------------------------- + void DisplayMenu(std::vector list) + { + // drawing and coloring menu selections + for (int i = 0; i < list.size(); i++) + { + olc::vi2d textSize = GetTextSize(list[i].label) / 2 * 4; + olc::Pixel textCol = olc::GREY; // greys out unselected options + if (highlighted == i) + { + textCol = olc::Pixel(255, 201, 14); // gold + } + DrawStringDecal(list[i].pos - textSize, list[i].label, textCol, { 4.0f, 4.0f }); + if (list[i].label2.size() > 0) + { + olc::vi2d offset = { ScreenWidth() / 3, -textSize.y / 2 }; + DrawStringDecal(list[i].pos + offset, list[i].label2, textCol, { 4.0f, 4.0f }); + } + } + + // selecting options + highlighted = std::clamp(highlighted, 0, (int)list.size() - 1); // loop if out of range + + int shortestDist=9999999; + int largestDist=-9999999; + int targetItem=highlighted; + + if (GetKey(olc::Key::DOWN).bPressed) { + for (int i=0;ilist[i].pos.y) { //It's above us. + int dist = abs(list[highlighted].pos.y-list[i].pos.y); + if (distlist[i].pos.y) { //It's above us. + int dist = abs(list[highlighted].pos.y-list[i].pos.y); + if (distlist[i].pos.x) { //It's to the left of us. + int dist = abs(list[highlighted].pos.x-list[i].pos.x); + if (dist>largestDist) { + targetItem=i; + largestDist=dist; + } + } + } + } + } + } + highlighted=targetItem; + } + + if (GetKey(olc::Key::LEFT).bPressed) { + for (int i=0;ilist[i].pos.x) { //It's to the left of us. + int dist = abs(list[highlighted].pos.x-list[i].pos.x); + if (distlargestDist) { + targetItem=i; + largestDist=dist; + } + } + } + } + } + } + highlighted=targetItem; + } + + if (highlighted >= (int)list.size()) + { + highlighted = 0; // wrap around when above max + } + if (highlighted < 0) + { + highlighted = list.size() - 1; // wrap around when below zero + } + } + +//-------------------------------------------------------------------------------------------------- +// controls +//-------------------------------------------------------------------------------------------------- + void GetAnyKeyPress(olc::Key keypress) override + { + if (configKeyIndex != -1) + { + switch (configKeyIndex) + { + case 0: + { + Move_Up = keypress; + }break; + case 1: + { + Move_Right = keypress; + }break; + case 2: + { + Move_Left = keypress; + }break; + case 3: + { + Move_Down = keypress; + }break; + } + controls[configKeyIndex].label2 = KeyToString(keypress); + configKeyIndex = -1; + } + } + +//-------------------------------------------------------------------------------------------------- +// Main Game Function +//-------------------------------------------------------------------------------------------------- + bool OnUserUpdate(float fElapsedTime) override + { + if (GetKey(olc::Key::CTRL).bHeld && GetKey(olc::Key::F12).bHeld && !bothKeysPressed) + { + return false; + } + + // dry skybox + GradientFillRectDecal({ 0.0f, 0.0f }, { ScreenWidth() + 0.0f, ScreenHeight() / 2 + 0.0f }, olc::DARK_BLUE, olc::BLUE, olc::BLUE, olc::DARK_BLUE); + + // the hills have eyes; y'know, like in Super Mario Bros. What reference did you think was going to be here? + DrawPartialDecal({ 0.0f, ScreenHeight() / 2 - 100.0f }, hill, { 0.0f + track_curve * 200, 0.0f }, { ScreenWidth() + 0.0f, (float)hill->sprite->height }, { 1.5f, 1.0f }); + //DrawPartialDecal({ 180.0f, ScreenHeight() / 2 - 100.0f }, hill, { 0.0f + track_curve * 200, 0.0f }, { ScreenWidth() + 0.0f, (float)hill->sprite->height }); + + // draw grass + DrawPartialWarpedDecal(grass, { { 0.0f, ScreenHeight() / 2 + 0.0f }, { -ScreenWidth() * 2 + 0.0f, ScreenHeight() + 0.0f}, { ScreenWidth() * 2 + ScreenWidth() + 0.0f, ScreenHeight() + 0.0f }, { ScreenWidth() + 0.0f, ScreenHeight() / 2 + 0.0f } }, { 0.0f, -distance }, { 1 * 32, 4 * 64 }); + +//-------------------------------------------------------------------------------------------------- + if (gameState == state::MAIN_MENU) + { + // display title + DrawDecal({ 95.5f, 95.5f }, title/*, {0.4f, 0.4f}*/); + DisplayMenu(mainMenu); + //DrawStringDecal({ ScreenWidth() / 2 + 0.0f, ScreenHeight() / 2 + 0.0f }, "START GAME", olc::WHITE, { 4.0f, 4.0f }); + + if (GetKey(olc::Key::ENTER).bPressed || GetKey(olc::Key::SPACE).bPressed) + { + // vertical menu + if (highlighted == 0) + { + gameState = state::PLAY_GAME; + highlighted = 0; + } + else if (highlighted == 1) + { + gameState = state::CONTROLS; + highlighted = 0; + } + else + { + return false; // quit game + } + } + if (GetKey(olc::Key::ESCAPE).bPressed) + { + return false; // exit via Escape key + } + } + +//-------------------------------------------------------------------------------------------------- + else if (gameState == state::PLAY_GAME) + { + DisplayMenu(playGame); + if (GetKey(olc::Key::ENTER).bPressed || GetKey(olc::Key::SPACE).bPressed) + { + // vertical menu + if (highlighted == 0) + { + gameState = state::TRACK_SELECT; + highlighted = 0; + } + else if (highlighted == 1) + { + gameState = state::CUP_SELECT; + highlighted = 0; + } + else + { + gameState = state::MAIN_MENU; // return to menu + highlighted = 0; + } + } + if (GetKey(olc::Key::ESCAPE).bPressed || GetKey(olc::Key::BACK).bPressed) + { + gameState = state::MAIN_MENU; + highlighted = 0; + } + } + +//-------------------------------------------------------------------------------------------------- + else if (gameState == state::TRACK_SELECT) + { + DisplayMenu(pickTrack); + if (GetKey(olc::Key::ENTER).bPressed || GetKey(olc::Key::SPACE).bPressed) + { + if (highlighted == 0) + { + gameState = state::CIRCUIT; + track = 1; + gameState = state::CAR_SELECT; + } + else if (highlighted == 1) + { + gameState = state::FIG_EIGHT; + track = 2; + gameState = state::CAR_SELECT; + } + else if (highlighted == 2) + { + gameState = state::ARROW_HEAD; + track = 3; + gameState = state::CAR_SELECT; + } + else if (highlighted == 3) + { + gameState = state::track_4; + track = 4; + gameState = state::CAR_SELECT; + } + else if (highlighted == 4) + { + gameState = state::OVERPASS; + track = 5; + gameState = state::CAR_SELECT; + } + else if (highlighted == 5) + { + gameState = state::PEANUT; + track = 6; + gameState = state::CAR_SELECT; + } + else if (highlighted == 6) + { + gameState = state::track_6; + track = 7; + gameState = state::CAR_SELECT; + } + else if (highlighted == 7) + { + gameState = state::track_7; + track = 8; + gameState = state::CAR_SELECT; + } + else if (highlighted == 8) + { + gameState = state::track_8; + track = 9; + gameState = state::CAR_SELECT; + } + else + { + gameState = state::PLAY_GAME; + highlighted = 0; + } + } + if (GetKey(olc::Key::CTRL).bHeld && GetKey(olc::Key::F9).bHeld) + { + // okay, so, gotta work out how to do cheat codes it seems xD + gameState = state::JX9; + track = 0; + gameState = state::CAR_SELECT; + } + if (GetKey(olc::Key::ESCAPE).bPressed || GetKey(olc::Key::BACK).bPressed) + { + gameState = state::PLAY_GAME; + highlighted = 0; + } + } + +//-------------------------------------------------------------------------------------------------- + else if (gameState == state::CUP_SELECT) + { + DisplayMenu(grandPrix); + if (GetKey(olc::Key::ENTER).bPressed || GetKey(olc::Key::SPACE).bPressed) + { + // 2 x 2 menu + if (highlighted == 0) + { + gameState = state::INDIE; + cup = 0; + gameState = state::CAR_SELECT; + } + else if (highlighted == 1) + { + gameState = state::STREET; + cup = 1; + gameState = state::CAR_SELECT; + } + else if (highlighted == 2) + { + gameState = state::PRO; + cup = 2; + gameState = state::CAR_SELECT; + } + else if (highlighted == 3) + { + gameState = state::GRAND_PRIX; + cup = 3; + gameState = state::CAR_SELECT; + } + else + { + gameState = state::PLAY_GAME; // return to menu + cup = -1; + highlighted = 0; + } + } + if (GetKey(olc::Key::ESCAPE).bPressed || GetKey(olc::Key::BACK).bPressed) + { + gameState = state::PLAY_GAME; + highlighted = 0; + } + } + +//-------------------------------------------------------------------------------------------------- + else if (gameState == state::CAR_SELECT) + { + DisplayMenu(selectCar); + if (GetKey(olc::Key::ENTER).bPressed || GetKey(olc::Key::SPACE).bPressed) + { + if (highlighted == 0) + { + // red car + player = 0; + gameState=state::RUN_GAME; + } + else if (highlighted == 1) + { + // blue car + player = 1; + } + else if (highlighted == 2) + { + // green car + player = 2; + } + else if (highlighted == 3) + { + // gold car + player = 3; + } + else if (highlighted == 4) + { + // purple car + player = 4; + } + else if (highlighted == 5) + { + // white car + player = 5; + } + else if (highlighted == 6) + { + // orange car + player = 6; + } + else if (highlighted == 7) + { + // black car + player = 7; + } + else + { + if (cup != -1) + { + // return to cup select + gameState = state::CUP_SELECT; + } + if (track != -1) + { + // return to track select + gameState = state::TRACK_SELECT; + } + highlighted = 0; + } + } + if (GetKey(olc::Key::ESCAPE).bPressed || GetKey(olc::Key::BACK).bPressed) + { + if (cup != -1) + { + // return to cup select + gameState = state::CUP_SELECT; + } + if (track != -1) + { + // return to track select + gameState = state::TRACK_SELECT; + } + highlighted = 0; + } + } + +//-------------------------------------------------------------------------------------------------- + else if (gameState == state::CONTROLS) + { + DisplayMenu(controls); + if (GetKey(olc::Key::ENTER).bPressed) + { + if (highlighted == 0) + { + configKeyIndex = highlighted; + } + else if (highlighted == 1) + { + configKeyIndex = highlighted; + } + else if (highlighted == 2) + { + configKeyIndex = highlighted; + } + else if (highlighted == 3) + { + configKeyIndex = highlighted; + } + else if (highlighted == 4) + { + // reset default controls + DisplayMenu(controls); + Move_Up = olc::W; + Move_Down = olc::S; + Move_Left = olc::A; + Move_Right = olc::D; + + } + else + { + gameState = state::MAIN_MENU; + highlighted = 0; + } + } + if (GetKey(olc::Key::ESCAPE).bPressed || GetKey(olc::Key::BACK).bPressed) + { + gameState = state::MAIN_MENU; + } + } + +//-------------------------------------------------------------------------------------------------- + if (gameState == state::RUN_GAME) // run main game loop + { + Clear(olc::BLACK); // this still needed? we've since replaced it with the gradient sky box + + // get a point on the track + float offset = 0; + int TrackSection = 0; + + cur_lap_time += fElapsedTime; + + // record lap time + if (distance >= track_dist) + { + distance -= track_dist; + list_times.push_front(cur_lap_time); // push time to front + list_times.pop_back(); // pop time to back + cur_lap_time = 0.0f; + } + + // find position on track (could optimize) << should probably optimize given the complexity of this game + while (TrackSection < vecTrack.size() && offset <= distance) + { + offset += vecTrack[TrackSection].second; + TrackSection++; + } + + float TargetCurvature = vecTrack[TrackSection - 1].first; // drawing curves to screen + + float TrackCurveDiff = (TargetCurvature - curvature) * fElapsedTime * speed; // correcting the drawing of curves to the screen + curvature += TrackCurveDiff; // update track curve difference + + track_curve += (curvature)*fElapsedTime * speed; + + + + // draw racetrack canvas + + std::vector pos; + std::vector uvs; + for (int y = 0; y < ScreenHeight() / 2; y++) + { + // racetrack canvas variables + float perspective = (float)y / (ScreenHeight() / 2.0f); + + float mid_point = 0.5f + curvature * powf((1.0f - perspective), 3); + float road_width = 0.1f + perspective * 0.8f; + float curb_width = road_width * 0.15f; + + road_width *= 0.5f; + + int lf_curb = (mid_point - road_width) * ScreenWidth(); + int rt_curb = (mid_point + road_width) * ScreenWidth(); + + int row = ScreenHeight() / 2 + y; + + float horizon = powf(1.0f - perspective, 2) * 80; + + // check for finish line + if (distance + horizon > track_dist - 20 && distance + horizon < track_dist) + { + // draw checkerboard pattern + uvs.push_back({ 0, fmod(((distance + horizon) - (track_dist - 20)) / 20.0f, 0.5f) + 0.5f }); + uvs.push_back({ 1, fmod(((distance + horizon) - (track_dist - 20)) / 20.0f, 0.5f) + 0.5f }); + } + else + { + // draw standard track piece + uvs.push_back({ 0, sinf(80.0f * powf(1.0f - perspective, 2) + distance) / 4 + 0.25f }); + uvs.push_back({ 1, sinf(80.0f * powf(1.0f - perspective, 2) + distance) / 4 + 0.25f }); + } + + // drawing grass and curb + pos.push_back({ lf_curb + 0.0f, row + 0.0f }); + pos.push_back({ rt_curb + 0.0f, row + 0.0f }); + + // black box rendering shenanigans; if I ever understand programming enough at a later date, I can figure out wtf is going on here + int i = 0; + for (Object& obj : gameObjects) + { + float horizonRange = powf(1.0f - perspective, 2) * ((distance + horizon) - obj.pos.y) / horizon; + if (!obj.rendered && (distance + horizon) > obj.pos.y && (distance + horizon) < obj.pos.y + 80 && row >= ScreenHeight() / 2 + ScreenHeight() / 2 * horizonRange) + { + obj.drawPos = { (mid_point + road_width * obj.pos.x) * ScreenWidth(), horizonRange * (ScreenHeight() / 2) + ScreenHeight() / 2 }; + obj.drawOffsetPos = { obj.offset.x, obj.size.y * road_width * -obj.offset.y }; + obj.drawSize = { obj.size.x * road_width, obj.size.y * road_width }; + obj.rendered = true; + + // yeah.... so, even after copying it manually, i still have no clue what this thing is doing, lol + } + } + } + + // on the road again; drawing the track + SetDecalStructure(olc::DecalStructure::STRIP); + DrawPolygonDecal(road, pos, uvs); + SetDecalStructure(olc::DecalStructure::FAN); + + // draw trackside props + for (Object& obj : gameObjects) + { + if (obj.rendered) + { + if (obj.decal != nullptr) + { + DrawDecal(obj.drawPos + obj.drawOffsetPos, obj.decal, obj.drawSize); + } + else + { + FillRectDecal(obj.drawPos, obj.drawSize, olc::BLUE); + } + } + } + + //---------------------------------------- + // debug quick-reset + if (GetKey(olc::Key::F4).bPressed) + { + Reset(); + } + // move forward + if (GetKey(olc::Key::W).bHeld || GetKey(olc::Key::UP).bHeld) + { + speed += 2.0f * fElapsedTime; + } + else // might remove this in a later stage of development + { + speed -= 1.0f * fElapsedTime; + } + // move back ? + if (GetKey(olc::Key::S).bHeld || GetKey(olc::Key::DOWN).bHeld) + { + distance -= 20.0f * fElapsedTime; + } + + int car_dir = 0; // default car facing + + // move left + if (GetKey(olc::Key::A).bHeld || GetKey(olc::Key::LEFT).bHeld) + { + car_curve -= 0.7f * fElapsedTime; + car_dir = -1; + } + // move right + if (GetKey(olc::Key::D).bHeld || GetKey(olc::Key::RIGHT).bHeld) + { + car_curve += 0.7f * fElapsedTime; + car_dir = +1; + } + + // slow car if on grass + if (fabs(car_curve - track_curve) >= 0.8f) + { + speed -= 5.0f * fElapsedTime; + } + + // clamp speed + if (speed < 0.0f) speed = 0.0f; + if (speed > 1.0f) speed = 1.0f; + + // move car along track according to car speed + distance += (70.0f * speed) * fElapsedTime; + + // draw car + car_pos = car_curve - track_curve; + DrawDecal({ ScreenWidth() / 2 - 128 + car_pos * ScreenWidth() / 2, ScreenHeight() / 4 * 3.0f - 128 }, car); + SetPixelMode(olc::Pixel::ALPHA); + + // spedometer + std::string mph = std::to_string(speed); + DrawString(4, 4, mph); + + // show time + auto disp_time = [](float t) + { + int min = t / 60.0f; + int sec = t - (min * 60.0f); + int milli = (t - (float)sec) * 1000.0f; + + // need to change this out to a 'DrawString()' function instead + return std::to_string(min) + "." + std::to_string(sec) + ":" + std::to_string(milli); + }; + + // correct for the first '0' in the seconds timer + //if () + //{ + // // draw min + '0' + sec + milli + // DrawString(4, 16, disp_time(cur_lap_time)); + //} + //else + //{ + DrawString(4, 16, disp_time(cur_lap_time)); + //} + + // display last 5 lap times + int j = 30; + for (auto l : list_times) + { + DrawString(10, j, disp_time(l)); + j += 10; + } + + // debug code + //std::string numb1 = std::to_string(car_pos); + //DrawString(4, 26, numb1); + //std::string numb2 = std::to_string(track_dist); + //DrawString(4, 38, numb2); + } + + return true; + } +}; + +//-------------------------------------------------------------------------------------------------- + +int main() +{ + Racer game; + if (game.Construct(1280, 720, 1, 1)) + game.Start(); + + return 0; +} + +//-------------------------------------------------------------------------------------------------- +// END OF FILE +//-------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/pixelGameEngine.h b/pixelGameEngine.h new file mode 100644 index 0000000..368ebc3 --- /dev/null +++ b/pixelGameEngine.h @@ -0,0 +1,6222 @@ +#pragma region license_and_help +/* + olcPixelGameEngine.h + + +-------------------------------------------------------------+ + | OneLoneCoder Pixel Game Engine v2.19 | + | "What do you need? Pixels... Lots of Pixels..." - javidx9 | + +-------------------------------------------------------------+ + + What is this? + ~~~~~~~~~~~~~ + olc::PixelGameEngine is a single file, cross platform graphics and userinput + framework used for games, visualisations, algorithm exploration and learning. + It was developed by YouTuber "javidx9" as an assistive tool for many of his + videos. The goal of this project is to provide high speed graphics with + minimal project setup complexity, to encourage new programmers, younger people, + and anyone else that wants to make fun things. + + However, olc::PixelGameEngine is not a toy! It is a powerful and fast utility + capable of delivering high resolution, high speed, high quality applications + which behave the same way regardless of the operating system or platform. + + This file provides the core utility set of the olc::PixelGameEngine, including + window creation, keyboard/mouse input, main game thread, timing, pixel drawing + routines, image/sprite loading and drawing routines, and a bunch of utility + types to make rapid development of games/visualisations possible. + + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2022 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions or derivations of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce the above + copyright notice. This list of conditions and the following disclaimer must be + reproduced in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may + be used to endorse or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + https://www.youtube.com/javidx9extra + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + Patreon: https://www.patreon.com/javidx9 + Community: https://community.onelonecoder.com + + + + Compiling in Linux + ~~~~~~~~~~~~~~~~~~ + You will need a modern C++ compiler, so update yours! + To compile use the command: + + g++ -o YourProgName YourSource.cpp -lX11 -lGL -lpthread -lpng -lstdc++fs -std=c++17 + + On some Linux configurations, the frame rate is locked to the refresh + rate of the monitor. This engine tries to unlock it but may not be + able to, in which case try launching your program like this: + + vblank_mode=0 ./YourProgName + + + + Compiling in Code::Blocks on Windows + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Well I wont judge you, but make sure your Code::Blocks installation + is really up to date - you may even consider updating your C++ toolchain + to use MinGW32-W64. + + Guide for installing recent GCC for Windows: + https://www.msys2.org/ + Guide for configuring code::blocks: + https://solarianprogrammer.com/2019/11/05/install-gcc-windows/ + https://solarianprogrammer.com/2019/11/16/install-codeblocks-gcc-windows-build-c-cpp-fortran-programs/ + + Add these libraries to "Linker Options": + user32 gdi32 opengl32 gdiplus Shlwapi dwmapi stdc++fs + + Set these compiler options: -std=c++17 + + + + Compiling on Mac - EXPERIMENTAL! PROBABLY HAS BUGS + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Yes yes, people use Macs for C++ programming! Who knew? Anyway, enough + arguing, thanks to Mumflr the PGE is now supported on Mac. Now I know nothing + about Mac, so if you need support, I suggest checking out the instructions + here: https://github.com/MumflrFumperdink/olcPGEMac + + clang++ -arch x86_64 -std=c++17 -mmacosx-version-min=10.15 -Wall -framework OpenGL + -framework GLUT -framework Carbon -lpng YourSource.cpp -o YourProgName + + + + Compiling with Emscripten (New & Experimental) + ~~~~~~~~~~~~~~~~~~~~~~~~~ + Emscripten compiler will turn your awesome C++ PixelGameEngine project into WASM! + This means you can run your application in teh browser, great for distributing + and submission in to jams and things! It's a bit new at the moment. + + em++ -std=c++17 -O2 -s ALLOW_MEMORY_GROWTH=1 -s MAX_WEBGL_VERSION=2 -s MIN_WEBGL_VERSION=2 -s USE_LIBPNG=1 ./YourSource.cpp -o pge.html + + + + Using stb_image.h + ~~~~~~~~~~~~~~~~~ + The PGE will load png images by default (with help from libpng on non-windows systems). + However, the excellent "stb_image.h" can be used instead, supporting a variety of + image formats, and has no library dependence - something we like at OLC studios ;) + To use stb_image.h, make sure it's in your code base, and simply: + + #define OLC_IMAGE_STB + + Before including the olcPixelGameEngine.h header file. stb_image.h works on many systems + and can be downloaded here: https://github.com/nothings/stb/blob/master/stb_image.h + + + + Multiple cpp file projects? + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + As a single header solution, the OLC_PGE_APPLICATION definition is used to + insert the engine implementation at a project location of your choosing. + The simplest way to setup multifile projects is to create a file called + "olcPixelGameEngine.cpp" which includes the following: + + #define OLC_PGE_APPLICATION + #include "olcPixelGameEngine.h" + + That's all it should include. You can also include PGEX includes and + defines in here too. With this in place, you dont need to + #define OLC_PGE_APPLICATION anywhere, and can simply include this + header file as an when you need to. + + + + Ports + ~~~~~ + olc::PixelGameEngine has been ported and tested with varying degrees of + success to: WinXP, Win7, Win8, Win10, Various Linux, Raspberry Pi, + Chromebook, Playstation Portable (PSP) and Nintendo Switch. If you are + interested in the details of these ports, come and visit the Discord! + + + + Thanks + ~~~~~~ + I'd like to extend thanks to Ian McKay, Bispoo, Eremiell, slavka, Kwizatz77, gurkanctn, Phantim, + IProgramInCPP, JackOJC, KrossX, Huhlig, Dragoneye, Appa, JustinRichardsMusic, SliceNDice, + dandistine, Ralakus, Gorbit99, raoul, joshinils, benedani, Moros1138, Alexio, SaladinAkara + & MagetzUb for advice, ideas and testing, and I'd like to extend my appreciation to the + 250K YouTube followers, 80+ Patreons, 4.8K Twitch followers and 10K Discord server members + who give me the motivation to keep going with all this :D + + Significant Contributors: @Moros1138, @SaladinAkara, @MaGetzUb, @slavka, + @Dragoneye, @Gorbit99, @dandistine & @Mumflr + + Special thanks to those who bring gifts! + GnarGnarHead.......Domina + Gorbit99...........Bastion, Ori & The Blind Forest, Terraria, Spelunky 2, Skully + Marti Morta........Gris + Danicron...........Terraria + SaladinAkara.......Aseprite, Inside, Quern: Undying Thoughts, Outer Wilds + AlterEgo...........Final Fantasy XII - The Zodiac Age + SlicEnDicE.........Noita, Inside + TGD................Voucher Gift + + Special thanks to my Patreons too - I wont name you on here, but I've + certainly enjoyed my tea and flapjacks :D + + + + Author + ~~~~~~ + David Barr, aka javidx9, �OneLoneCoder 2018, 2019, 2020, 2021, 2022 +*/ +#pragma endregion + +#pragma region version_history +/* + 2.01: Made renderer and platform static for multifile projects + 2.02: Added Decal destructor, optimised Pixel constructor + 2.03: Added FreeBSD flags, Added DrawStringDecal() + 2.04: Windows Full-Screen bug fixed + 2.05: +DrawPartialWarpedDecal() - draws a warped decal from a subset image + +DrawPartialRotatedDecal() - draws a rotated decal from a subset image + 2.06: +GetTextSize() - returns area occupied by multiline string + +GetWindowSize() - returns actual window size + +GetElapsedTime() - returns last calculated fElapsedTime + +GetWindowMouse() - returns actual mouse location in window + +DrawExplicitDecal() - bow-chikka-bow-bow + +DrawPartialDecal(pos, size) - draws a partial decal to specified area + +FillRectDecal() - draws a flat shaded rectangle as a decal + +GradientFillRectDecal() - draws a rectangle, with unique colour corners + +Modified DrawCircle() & FillCircle() - Thanks IanM-Matrix1 (#PR121) + +Gone someway to appeasing pedants + 2.07: +GetPixelSize() - returns user specified pixel size + +GetScreenPixelSize() - returns actual size in monitor pixels + +Pixel Cohesion Mode (flag in Construct()) - disallows arbitrary window scaling + +Working VSYNC in Windows windowed application - now much smoother + +Added string conversion for olc::vectors + +Added comparator operators for olc::vectors + +Added DestroyWindow() on windows platforms for serial PGE launches + +Added GetMousePos() to stop TarriestPython whinging + 2.08: Fix SetScreenSize() aspect ratio pre-calculation + Fix DrawExplicitDecal() - stupid oversight with multiple decals + Disabled olc::Sprite copy constructor + +olc::Sprite Duplicate() - produces a new clone of the sprite + +olc::Sprite Duplicate(pos, size) - produces a new sprite from the region defined + +Unary operators for vectors + +More pedant mollification - Thanks TheLandfill + +ImageLoader modules - user selectable image handling core, gdi+, libpng, stb_image + +Mac Support via GLUT - thanks Mumflr! + 2.09: Fix olc::Renderable Image load error - Thanks MaGetzUb & Zij-IT for finding and moaning about it + Fix file rejection in image loaders when using resource packs + Tidied Compiler defines per platform - Thanks slavka + +Pedant fixes, const correctness in parts + +DecalModes - Normal, Additive, Multiplicative blend modes + +Pixel Operators & Lerping + +Filtered Decals - If you hate pixels, then erase this file + +DrawStringProp(), GetTextSizeProp(), DrawStringPropDecal() - Draws non-monospaced font + 2.10: Fix PixelLerp() - oops my bad, lerped the wrong way :P + Fix "Shader" support for strings - thanks Megarev for crying about it + Fix GetTextSizeProp() - Height was just plain wrong... + +vec2d operator overloads (element wise *=, /=) + +vec2d comparison operators... :| yup... hmmmm... + +vec2d ceil(), floor(), min(), max() functions - surprising how often I do it manually + +DrawExplicitDecal(... uint32_t elements) - complete control over convex polygons and lines + +DrawPolygonDecal() - to keep Bispoo happy, required significant rewrite of EVERYTHING, but hey ho + +Complete rewrite of decal renderer + +OpenGL 3.3 Renderer (also supports Raspberry Pi) + +PGEX Break-In Hooks - with a push from Dandistine + +Wireframe Decal Mode - For debug overlays + 2.11: Made PGEX hooks optional - (provide true to super constructor) + 2.12: Fix for MinGW compiler non-compliance :( - why is its sdk structure different?? why??? + 2.13: +GetFontSprite() - allows access to font data + 2.14: Fix WIN32 Definition reshuffle + Fix DrawPartialDecal() - messed up dimension during renderer experiment, didnt remove junk code, thanks Alexio + Fix? Strange error regarding GDI+ Image Loader not knowing about COM, SDK change? + 2.15: Big Reformat + +WASM Platform (via Emscripten) - Big Thanks to OLC Community - See Platform for details + +Sample Mode for Decals + +Made olc_ConfigureSystem() accessible + +Added OLC_----_CUSTOM_EX for externalised platforms, renderers and image loaders + =Refactored olc::Sprite pixel data store + -Deprecating LoadFromPGESprFile() + -Deprecating SaveToPGESprFile() + Fix Pixel -= operator (thanks Au Lit) + 2.16: FIX Emscripten JS formatting in VS IDE (thanks Moros) + +"Headless" Mode + +DrawLineDecal() + +Mouse Button Constants + +Move Constructor for olc::Renderable + +Polar/Cartesian conversion for v2d_generic + +DrawRotatedStringDecal()/DrawRotatedStringPropDecal() (thanks Oso-Grande/Sopadeoso (PR #209)) + =Using olc::Renderable for layer surface + +Major Mac and GLUT Update (thanks Mumflr) + 2.17: +Clipping for DrawLine() functions + +Reintroduced sub-pixel decals + +Modified DrawPartialDecal() to quantise and correctly sample from tile atlasses + +olc::Sprite::GetPixel() - Clamp Mode + 2.18: +Option to not "dirty" layers with SetDrawTarget() - Thanks TerasKasi! + =Detection for Mac M1, fix for scroll wheel interrogation - Thanks ruarq! + 2.19: Textual Input(of)course Edition! + =Built in font is now olc::Renderable + +EnablePixelTransfer() - Gate if layer content transfers occur (speedup in decal only apps) + +TextEntryEnable() - Enables/Disables text entry mode + +TextEntryGetString() - Gets the current accumulated string in text entry mode + +TextEntryGetCursor() - Gets the current cursor position in text entry mode + +IsTextEntryEnabled() - Returns true if text entry mode is activated + +OnTextEntryComplete() - Override is called when user presses "ENTER" in text entry mode + +Potential for regional keyboard mappings - needs volunteers to do this + +ConsoleShow() - Opens built in command console + +ConsoleClear() - Clears built in command console output + +ConsoleOut() - Stream strings to command console output + +ConsoleCaptureStdOut() - Capture std::cout by redirecting to built-in console + +IsConsoleShowing() - Returns true if console is currently active + +OnConsoleCommand() - Override is called when command is entered into built in console + + !! Apple Platforms will not see these updates immediately - Sorry, I dont have a mac to test... !! + !! Volunteers willing to help appreciated, though PRs are manually integrated with credit !! +*/ +#pragma endregion + +#pragma region hello_world_example +// O------------------------------------------------------------------------------O +// | Example "Hello World" Program (main.cpp) | +// O------------------------------------------------------------------------------O +/* + +#define OLC_PGE_APPLICATION +#include "olcPixelGameEngine.h" + +// Override base class with your custom functionality +class Example : public olc::PixelGameEngine +{ +public: + Example() + { + // Name your application + sAppName = "Example"; + } + +public: + bool OnUserCreate() override + { + // Called once at the start, so create things here + return true; + } + + bool OnUserUpdate(float fElapsedTime) override + { + // Called once per frame, draws random coloured pixels + for (int x = 0; x < ScreenWidth(); x++) + for (int y = 0; y < ScreenHeight(); y++) + Draw(x, y, olc::Pixel(rand() % 256, rand() % 256, rand() % 256)); + return true; + } +}; + +int main() +{ + Example demo; + if (demo.Construct(256, 240, 4, 4)) + demo.Start(); + return 0; +} + +*/ +#pragma endregion + +#ifndef OLC_PGE_DEF +#define OLC_PGE_DEF + +#pragma region std_includes +// O------------------------------------------------------------------------------O +// | STANDARD INCLUDES | +// O------------------------------------------------------------------------------O +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#pragma endregion + +#define PGE_VER 219 + +// O------------------------------------------------------------------------------O +// | COMPILER CONFIGURATION ODDITIES | +// O------------------------------------------------------------------------------O +#pragma region compiler_config +#define USE_EXPERIMENTAL_FS +#if defined(_WIN32) + #if _MSC_VER >= 1920 && _MSVC_LANG >= 201703L + #undef USE_EXPERIMENTAL_FS + #endif +#endif +#if defined(__linux__) || defined(__MINGW32__) || defined(__EMSCRIPTEN__) || defined(__FreeBSD__) || defined(__APPLE__) + #if __cplusplus >= 201703L + #undef USE_EXPERIMENTAL_FS + #endif +#endif + +#if !defined(OLC_KEYBOARD_UK) + #define OLC_KEYBOARD_UK +#endif + + +#if defined(USE_EXPERIMENTAL_FS) || defined(FORCE_EXPERIMENTAL_FS) + // C++14 + #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING + #include + namespace _gfs = std::experimental::filesystem::v1; +#else + // C++17 + #include + namespace _gfs = std::filesystem; +#endif + +#if defined(UNICODE) || defined(_UNICODE) + #define olcT(s) L##s +#else + #define olcT(s) s +#endif + +#define UNUSED(x) (void)(x) + +// O------------------------------------------------------------------------------O +// | PLATFORM SELECTION CODE, Thanks slavka! | +// O------------------------------------------------------------------------------O + +// Platform +#if !defined(OLC_PLATFORM_WINAPI) && !defined(OLC_PLATFORM_X11) && !defined(OLC_PLATFORM_GLUT) && !defined(OLC_PLATFORM_EMSCRIPTEN) + #if !defined(OLC_PLATFORM_CUSTOM_EX) + #if defined(_WIN32) + #define OLC_PLATFORM_WINAPI + #endif + #if defined(__linux__) || defined(__FreeBSD__) + #define OLC_PLATFORM_X11 + #endif + #if defined(__APPLE__) + #define GL_SILENCE_DEPRECATION + #define OLC_PLATFORM_GLUT + #endif + #if defined(__EMSCRIPTEN__) + #define OLC_PLATFORM_EMSCRIPTEN + #endif + #endif +#endif + +// Start Situation +#if defined(OLC_PLATFORM_GLUT) || defined(OLC_PLATFORM_EMSCRIPTEN) + #define PGE_USE_CUSTOM_START +#endif + +// Renderer +#if !defined(OLC_GFX_OPENGL10) && !defined(OLC_GFX_OPENGL33) && !defined(OLC_GFX_DIRECTX10) + #if !defined(OLC_GFX_CUSTOM_EX) + #if defined(OLC_PLATFORM_EMSCRIPTEN) + #define OLC_GFX_OPENGL33 + #else + #define OLC_GFX_OPENGL10 + #endif + #endif +#endif + +// Image loader +#if !defined(OLC_IMAGE_STB) && !defined(OLC_IMAGE_GDI) && !defined(OLC_IMAGE_LIBPNG) + #if !defined(OLC_IMAGE_CUSTOM_EX) + #if defined(_WIN32) + #define OLC_IMAGE_GDI + #endif + #if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) + #define OLC_IMAGE_LIBPNG + #endif + #endif +#endif + + +// O------------------------------------------------------------------------------O +// | PLATFORM-SPECIFIC DEPENDENCIES | +// O------------------------------------------------------------------------------O +#if !defined(OLC_PGE_HEADLESS) +#if defined(OLC_PLATFORM_WINAPI) + #define _WINSOCKAPI_ // Thanks Cornchipss + #if !defined(VC_EXTRALEAN) + #define VC_EXTRALEAN + #endif + #if !defined(NOMINMAX) + #define NOMINMAX + #endif + + // In Code::Blocks + #if !defined(_WIN32_WINNT) + #ifdef HAVE_MSMF + #define _WIN32_WINNT 0x0600 // Windows Vista + #else + #define _WIN32_WINNT 0x0500 // Windows 2000 + #endif + #endif + + #include + #undef _WINSOCKAPI_ +#endif + +#if defined(OLC_PLATFORM_X11) + namespace X11 + { + #include + #include + } +#endif + +#if defined(OLC_PLATFORM_GLUT) + #if defined(__linux__) + #include + #include + #endif + #if defined(__APPLE__) + #include + #include + #include + #endif +#endif +#endif +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine INTERFACE DECLARATION | +// O------------------------------------------------------------------------------O +#pragma region pge_declaration +namespace olc +{ + class PixelGameEngine; + class Sprite; + + // Pixel Game Engine Advanced Configuration + constexpr uint8_t nMouseButtons = 5; + constexpr uint8_t nDefaultAlpha = 0xFF; + constexpr uint32_t nDefaultPixel = (nDefaultAlpha << 24); + constexpr uint8_t nTabSizeInSpaces = 4; + enum rcode { FAIL = 0, OK = 1, NO_FILE = -1 }; + + // O------------------------------------------------------------------------------O + // | olc::Pixel - Represents a 32-Bit RGBA colour | + // O------------------------------------------------------------------------------O + struct Pixel + { + union + { + uint32_t n = nDefaultPixel; + struct { uint8_t r; uint8_t g; uint8_t b; uint8_t a; }; + }; + + enum Mode { NORMAL, MASK, ALPHA, CUSTOM }; + + Pixel(); + Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = nDefaultAlpha); + Pixel(uint32_t p); + Pixel& operator = (const Pixel& v) = default; + bool operator ==(const Pixel& p) const; + bool operator !=(const Pixel& p) const; + Pixel operator * (const float i) const; + Pixel operator / (const float i) const; + Pixel& operator *=(const float i); + Pixel& operator /=(const float i); + Pixel operator + (const Pixel& p) const; + Pixel operator - (const Pixel& p) const; + Pixel& operator +=(const Pixel& p); + Pixel& operator -=(const Pixel& p); + Pixel inv() const; + }; + + Pixel PixelF(float red, float green, float blue, float alpha = 1.0f); + Pixel PixelLerp(const olc::Pixel& p1, const olc::Pixel& p2, float t); + + + // O------------------------------------------------------------------------------O + // | USEFUL CONSTANTS | + // O------------------------------------------------------------------------------O + static const Pixel + GREY(192, 192, 192), DARK_GREY(128, 128, 128), VERY_DARK_GREY(64, 64, 64), + RED(255, 0, 0), DARK_RED(128, 0, 0), VERY_DARK_RED(64, 0, 0), + YELLOW(255, 255, 0), DARK_YELLOW(128, 128, 0), VERY_DARK_YELLOW(64, 64, 0), + GREEN(0, 255, 0), DARK_GREEN(0, 128, 0), VERY_DARK_GREEN(0, 64, 0), + CYAN(0, 255, 255), DARK_CYAN(0, 128, 128), VERY_DARK_CYAN(0, 64, 64), + BLUE(0, 0, 255), DARK_BLUE(0, 0, 128), VERY_DARK_BLUE(0, 0, 64), + MAGENTA(255, 0, 255), DARK_MAGENTA(128, 0, 128), VERY_DARK_MAGENTA(64, 0, 64), + WHITE(255, 255, 255), BLACK(0, 0, 0), BLANK(0, 0, 0, 0); + + // Thanks to scripticuk and others for updating the key maps + // NOTE: The GLUT platform will need updating, open to contributions ;) + enum Key + { + NONE, + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, + K0, K1, K2, K3, K4, K5, K6, K7, K8, K9, + F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, + UP, DOWN, LEFT, RIGHT, + SPACE, TAB, SHIFT, CTRL, INS, DEL, HOME, END, PGUP, PGDN, + BACK, ESCAPE, RETURN, ENTER, PAUSE, SCROLL, + NP0, NP1, NP2, NP3, NP4, NP5, NP6, NP7, NP8, NP9, + NP_MUL, NP_DIV, NP_ADD, NP_SUB, NP_DECIMAL, PERIOD, + EQUALS, COMMA, MINUS, + OEM_1, OEM_2, OEM_3, OEM_4, OEM_5, OEM_6, OEM_7, OEM_8, + CAPS_LOCK, ENUM_END + }; + + namespace Mouse + { + static constexpr int32_t LEFT = 0; + static constexpr int32_t RIGHT = 1; + static constexpr int32_t MIDDLE = 2; + }; + + // O------------------------------------------------------------------------------O + // | olc::HWButton - Represents the state of a hardware button (mouse/key/joy) | + // O------------------------------------------------------------------------------O + struct HWButton + { + bool bPressed = false; // Set once during the frame the event occurs + bool bReleased = false; // Set once during the frame the event occurs + bool bHeld = false; // Set true for all frames between pressed and released events + }; + + + + + // O------------------------------------------------------------------------------O + // | olc::vX2d - A generic 2D vector type | + // O------------------------------------------------------------------------------O +#if !defined(OLC_IGNORE_VEC2D) + template + struct v2d_generic + { + T x = 0; + T y = 0; + v2d_generic() : x(0), y(0) {} + v2d_generic(T _x, T _y) : x(_x), y(_y) {} + v2d_generic(const v2d_generic& v) : x(v.x), y(v.y) {} + v2d_generic& operator=(const v2d_generic& v) = default; + T mag() const { return T(std::sqrt(x * x + y * y)); } + T mag2() const { return x * x + y * y; } + v2d_generic norm() const { T r = 1 / mag(); return v2d_generic(x * r, y * r); } + v2d_generic perp() const { return v2d_generic(-y, x); } + v2d_generic floor() const { return v2d_generic(std::floor(x), std::floor(y)); } + v2d_generic ceil() const { return v2d_generic(std::ceil(x), std::ceil(y)); } + v2d_generic max(const v2d_generic& v) const { return v2d_generic(std::max(x, v.x), std::max(y, v.y)); } + v2d_generic min(const v2d_generic& v) const { return v2d_generic(std::min(x, v.x), std::min(y, v.y)); } + v2d_generic cart() { return { std::cos(y) * x, std::sin(y) * x }; } + v2d_generic polar() { return { mag(), std::atan2(y, x) }; } + T dot(const v2d_generic& rhs) const { return this->x * rhs.x + this->y * rhs.y; } + T cross(const v2d_generic& rhs) const { return this->x * rhs.y - this->y * rhs.x; } + v2d_generic operator + (const v2d_generic& rhs) const { return v2d_generic(this->x + rhs.x, this->y + rhs.y); } + v2d_generic operator - (const v2d_generic& rhs) const { return v2d_generic(this->x - rhs.x, this->y - rhs.y); } + v2d_generic operator * (const T& rhs) const { return v2d_generic(this->x * rhs, this->y * rhs); } + v2d_generic operator * (const v2d_generic& rhs) const { return v2d_generic(this->x * rhs.x, this->y * rhs.y); } + v2d_generic operator / (const T& rhs) const { return v2d_generic(this->x / rhs, this->y / rhs); } + v2d_generic operator / (const v2d_generic& rhs) const { return v2d_generic(this->x / rhs.x, this->y / rhs.y); } + v2d_generic& operator += (const v2d_generic& rhs) { this->x += rhs.x; this->y += rhs.y; return *this; } + v2d_generic& operator -= (const v2d_generic& rhs) { this->x -= rhs.x; this->y -= rhs.y; return *this; } + v2d_generic& operator *= (const T& rhs) { this->x *= rhs; this->y *= rhs; return *this; } + v2d_generic& operator /= (const T& rhs) { this->x /= rhs; this->y /= rhs; return *this; } + v2d_generic& operator *= (const v2d_generic& rhs) { this->x *= rhs.x; this->y *= rhs.y; return *this; } + v2d_generic& operator /= (const v2d_generic& rhs) { this->x /= rhs.x; this->y /= rhs.y; return *this; } + v2d_generic operator + () const { return { +x, +y }; } + v2d_generic operator - () const { return { -x, -y }; } + bool operator == (const v2d_generic& rhs) const { return (this->x == rhs.x && this->y == rhs.y); } + bool operator != (const v2d_generic& rhs) const { return (this->x != rhs.x || this->y != rhs.y); } + const std::string str() const { return std::string("(") + std::to_string(this->x) + "," + std::to_string(this->y) + ")"; } + friend std::ostream& operator << (std::ostream& os, const v2d_generic& rhs) { os << rhs.str(); return os; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + }; + + // Note: joshinils has some good suggestions here, but they are complicated to implement at this moment, + // however they will appear in a future version of PGE + template inline v2d_generic operator * (const float& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (float)rhs.x), (T)(lhs * (float)rhs.y)); } + template inline v2d_generic operator * (const double& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (double)rhs.x), (T)(lhs * (double)rhs.y)); } + template inline v2d_generic operator * (const int& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (int)rhs.x), (T)(lhs * (int)rhs.y)); } + template inline v2d_generic operator / (const float& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (float)rhs.x), (T)(lhs / (float)rhs.y)); } + template inline v2d_generic operator / (const double& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (double)rhs.x), (T)(lhs / (double)rhs.y)); } + template inline v2d_generic operator / (const int& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (int)rhs.x), (T)(lhs / (int)rhs.y)); } + + // To stop dandistine crying... + template inline bool operator < (const v2d_generic& lhs, const v2d_generic& rhs) + { return lhs.y < rhs.y || (lhs.y == rhs.y && lhs.x < rhs.x); } + template inline bool operator > (const v2d_generic& lhs, const v2d_generic& rhs) + { return lhs.y > rhs.y || (lhs.y == rhs.y && lhs.x > rhs.x); } + + typedef v2d_generic vi2d; + typedef v2d_generic vu2d; + typedef v2d_generic vf2d; + typedef v2d_generic vd2d; +#endif + + + + + + + // O------------------------------------------------------------------------------O + // | olc::ResourcePack - A virtual scrambled filesystem to pack your assets into | + // O------------------------------------------------------------------------------O + struct ResourceBuffer : public std::streambuf + { + ResourceBuffer(std::ifstream& ifs, uint32_t offset, uint32_t size); + std::vector vMemory; + }; + + class ResourcePack : public std::streambuf + { + public: + ResourcePack(); + ~ResourcePack(); + bool AddFile(const std::string& sFile); + bool LoadPack(const std::string& sFile, const std::string& sKey); + bool SavePack(const std::string& sFile, const std::string& sKey); + ResourceBuffer GetFileBuffer(const std::string& sFile); + bool Loaded(); + private: + struct sResourceFile { uint32_t nSize; uint32_t nOffset; }; + std::map mapFiles; + std::ifstream baseFile; + std::vector scramble(const std::vector& data, const std::string& key); + std::string makeposix(const std::string& path); + }; + + + class ImageLoader + { + public: + ImageLoader() = default; + virtual ~ImageLoader() = default; + virtual olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) = 0; + virtual olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) = 0; + }; + + + // O------------------------------------------------------------------------------O + // | olc::Sprite - An image represented by a 2D array of olc::Pixel | + // O------------------------------------------------------------------------------O + class Sprite + { + public: + Sprite(); + Sprite(const std::string& sImageFile, olc::ResourcePack* pack = nullptr); + Sprite(int32_t w, int32_t h); + Sprite(const olc::Sprite&) = delete; + ~Sprite(); + + public: + olc::rcode LoadFromFile(const std::string& sImageFile, olc::ResourcePack* pack = nullptr); + + public: + int32_t width = 0; + int32_t height = 0; + enum Mode { NORMAL, PERIODIC, CLAMP }; + enum Flip { NONE = 0, HORIZ = 1, VERT = 2 }; + + public: + void SetSampleMode(olc::Sprite::Mode mode = olc::Sprite::Mode::NORMAL); + Pixel GetPixel(int32_t x, int32_t y) const; + bool SetPixel(int32_t x, int32_t y, Pixel p); + Pixel GetPixel(const olc::vi2d& a) const; + bool SetPixel(const olc::vi2d& a, Pixel p); + Pixel Sample(float x, float y) const; + Pixel SampleBL(float u, float v) const; + Pixel* GetData(); + olc::Sprite* Duplicate(); + olc::Sprite* Duplicate(const olc::vi2d& vPos, const olc::vi2d& vSize); + std::vector pColData; + Mode modeSample = Mode::NORMAL; + + static std::unique_ptr loader; + }; + + // O------------------------------------------------------------------------------O + // | olc::Decal - A GPU resident storage of an olc::Sprite | + // O------------------------------------------------------------------------------O + class Decal + { + public: + Decal(olc::Sprite* spr, bool filter = false, bool clamp = true); + Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr); + virtual ~Decal(); + void Update(); + void UpdateSprite(); + + public: // But dont touch + int32_t id = -1; + olc::Sprite* sprite = nullptr; + olc::vf2d vUVScale = { 1.0f, 1.0f }; + }; + + enum class DecalMode + { + NORMAL, + ADDITIVE, + MULTIPLICATIVE, + STENCIL, + ILLUMINATE, + WIREFRAME, + MODEL3D, + }; + + enum class DecalStructure + { + LINE, + FAN, + STRIP, + LIST + }; + + // O------------------------------------------------------------------------------O + // | olc::Renderable - Convenience class to keep a sprite and decal together | + // O------------------------------------------------------------------------------O + class Renderable + { + public: + Renderable() = default; + Renderable(Renderable&& r) : pSprite(std::move(r.pSprite)), pDecal(std::move(r.pDecal)) {} + Renderable(const Renderable&) = delete; + olc::rcode Load(const std::string& sFile, ResourcePack* pack = nullptr, bool filter = false, bool clamp = true); + void Create(uint32_t width, uint32_t height, bool filter = false, bool clamp = true); + olc::Decal* Decal() const; + olc::Sprite* Sprite() const; + + private: + std::unique_ptr pSprite = nullptr; + std::unique_ptr pDecal = nullptr; + }; + + + // O------------------------------------------------------------------------------O + // | Auxilliary components internal to engine | + // O------------------------------------------------------------------------------O + + struct DecalInstance + { + olc::Decal* decal = nullptr; + std::vector pos; + std::vector uv; + std::vector w; + std::vector tint; + olc::DecalMode mode = olc::DecalMode::NORMAL; + olc::DecalStructure structure = olc::DecalStructure::FAN; + uint32_t points = 0; + }; + + struct LayerDesc + { + olc::vf2d vOffset = { 0, 0 }; + olc::vf2d vScale = { 1, 1 }; + bool bShow = false; + bool bUpdate = false; + olc::Renderable pDrawTarget; + uint32_t nResID = 0; + std::vector vecDecalInstance; + olc::Pixel tint = olc::WHITE; + std::function funcHook = nullptr; + }; + + class Renderer + { + public: + virtual ~Renderer() = default; + virtual void PrepareDevice() = 0; + virtual olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) = 0; + virtual olc::rcode DestroyDevice() = 0; + virtual void DisplayFrame() = 0; + virtual void PrepareDrawing() = 0; + virtual void SetDecalMode(const olc::DecalMode& mode) = 0; + virtual void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) = 0; + virtual void DrawDecal(const olc::DecalInstance& decal) = 0; + virtual uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered = false, const bool clamp = true) = 0; + virtual void UpdateTexture(uint32_t id, olc::Sprite* spr) = 0; + virtual void ReadTexture(uint32_t id, olc::Sprite* spr) = 0; + virtual uint32_t DeleteTexture(const uint32_t id) = 0; + virtual void ApplyTexture(uint32_t id) = 0; + virtual void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) = 0; + virtual void ClearBuffer(olc::Pixel p, bool bDepth) = 0; + static olc::PixelGameEngine* ptrPGE; + }; + + class Platform + { + public: + virtual ~Platform() = default; + virtual olc::rcode ApplicationStartUp() = 0; + virtual olc::rcode ApplicationCleanUp() = 0; + virtual olc::rcode ThreadStartUp() = 0; + virtual olc::rcode ThreadCleanUp() = 0; + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) = 0; + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) = 0; + virtual olc::rcode SetWindowTitle(const std::string& s) = 0; + virtual olc::rcode StartSystemEventLoop() = 0; + virtual olc::rcode HandleSystemEvent() = 0; + static olc::PixelGameEngine* ptrPGE; + }; + + class PGEX; + + // The Static Twins (plus one) + static std::unique_ptr renderer; + static std::unique_ptr platform; + static std::map mapKeys; + + // O------------------------------------------------------------------------------O + // | olc::PixelGameEngine - The main BASE class for your application | + // O------------------------------------------------------------------------------O + class PixelGameEngine + { + public: + PixelGameEngine(); + virtual ~PixelGameEngine(); + public: + olc::rcode Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, + bool full_screen = false, bool vsync = false, bool cohesion = false); + olc::rcode Start(); + + public: // User Override Interfaces + // Called once on application startup, use to load your resources + virtual bool OnUserCreate(); + // Called every frame, and provides you with a time per frame value + virtual bool OnUserUpdate(float fElapsedTime); + // Called once on application termination, so you can be one clean coder + virtual bool OnUserDestroy(); + virtual void GetAnyKey(); + virtual void GetAnyKeyPress(olc::Key pressedKey); + + // Called when a text entry is confirmed with "enter" key + virtual void OnTextEntryComplete(const std::string& sText); + // Called when a console command is executed + virtual bool OnConsoleCommand(const std::string& sCommand); + + public: // Hardware Interfaces + // Returns true if window is currently in focus + bool IsFocused() const; + // Get the state of a specific keyboard button + HWButton GetKey(Key k) const; + // Get the state of a specific mouse button + HWButton GetMouse(uint32_t b) const; + // Get Mouse X coordinate in "pixel" space + int32_t GetMouseX() const; + // Get Mouse Y coordinate in "pixel" space + int32_t GetMouseY() const; + // Get Mouse Wheel Delta + int32_t GetMouseWheel() const; + // Get the mouse in window space + const olc::vi2d& GetWindowMouse() const; + // Gets the mouse as a vector to keep Tarriest happy + const olc::vi2d& GetMousePos() const; + + static const std::map& GetKeyMap() { return mapKeys; } + + public: // Utility + // Returns the width of the screen in "pixels" + int32_t ScreenWidth() const; + // Returns the height of the screen in "pixels" + int32_t ScreenHeight() const; + // Returns the width of the currently selected drawing target in "pixels" + int32_t GetDrawTargetWidth() const; + // Returns the height of the currently selected drawing target in "pixels" + int32_t GetDrawTargetHeight() const; + // Returns the currently active draw target + olc::Sprite* GetDrawTarget() const; + // Resize the primary screen sprite + void SetScreenSize(int w, int h); + // Specify which Sprite should be the target of drawing functions, use nullptr + // to specify the primary screen + void SetDrawTarget(Sprite* target); + // Gets the current Frames Per Second + uint32_t GetFPS() const; + // Gets last update of elapsed time + float GetElapsedTime() const; + // Gets Actual Window size + const olc::vi2d& GetWindowSize() const; + // Gets pixel scale + const olc::vi2d& GetPixelSize() const; + // Gets actual pixel scale + const olc::vi2d& GetScreenPixelSize() const; + + public: // CONFIGURATION ROUTINES + // Layer targeting functions + void SetDrawTarget(uint8_t layer, bool bDirty = true); + void EnableLayer(uint8_t layer, bool b); + void SetLayerOffset(uint8_t layer, const olc::vf2d& offset); + void SetLayerOffset(uint8_t layer, float x, float y); + void SetLayerScale(uint8_t layer, const olc::vf2d& scale); + void SetLayerScale(uint8_t layer, float x, float y); + void SetLayerTint(uint8_t layer, const olc::Pixel& tint); + void SetLayerCustomRenderFunction(uint8_t layer, std::function f); + + std::vector& GetLayers(); + uint32_t CreateLayer(); + + // Change the pixel mode for different optimisations + // olc::Pixel::NORMAL = No transparency + // olc::Pixel::MASK = Transparent if alpha is < 255 + // olc::Pixel::ALPHA = Full transparency + void SetPixelMode(Pixel::Mode m); + Pixel::Mode GetPixelMode(); + // Use a custom blend function + void SetPixelMode(std::function pixelMode); + // Change the blend factor from between 0.0f to 1.0f; + void SetPixelBlend(float fBlend); + + + + public: // DRAWING ROUTINES + // Draws a single Pixel + virtual bool Draw(int32_t x, int32_t y, Pixel p = olc::WHITE); + bool Draw(const olc::vi2d& pos, Pixel p = olc::WHITE); + // Draws a line from (x1,y1) to (x2,y2) + void DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + void DrawLine(const olc::vi2d& pos1, const olc::vi2d& pos2, Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + // Draws a circle located at (x,y) with radius + void DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE, uint8_t mask = 0xFF); + void DrawCircle(const olc::vi2d& pos, int32_t radius, Pixel p = olc::WHITE, uint8_t mask = 0xFF); + // Fills a circle located at (x,y) with radius + void FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE); + void FillCircle(const olc::vi2d& pos, int32_t radius, Pixel p = olc::WHITE); + // Draws a rectangle at (x,y) to (x+w,y+h) + void DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); + void DrawRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p = olc::WHITE); + // Fills a rectangle at (x,y) to (x+w,y+h) + void FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); + void FillRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p = olc::WHITE); + // Draws a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); + void DrawTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p = olc::WHITE); + // Flat fills a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); + void FillTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p = olc::WHITE); + // Draws an entire sprite at location (x,y) + void DrawSprite(int32_t x, int32_t y, Sprite* sprite, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + void DrawSprite(const olc::vi2d& pos, Sprite* sprite, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + // Draws an area of a sprite at location (x,y), where the + // selected area is (ox,oy) to (ox+w,oy+h) + void DrawPartialSprite(int32_t x, int32_t y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + void DrawPartialSprite(const olc::vi2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + // Draws a single line of text - traditional monospaced + void DrawString(int32_t x, int32_t y, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + void DrawString(const olc::vi2d& pos, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + olc::vi2d GetTextSize(const std::string& s); + // Draws a single line of text - non-monospaced + void DrawStringProp(int32_t x, int32_t y, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + void DrawStringProp(const olc::vi2d& pos, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + olc::vi2d GetTextSizeProp(const std::string& s); + + // Decal Quad functions + void SetDecalMode(const olc::DecalMode& mode); + void SetDecalStructure(const olc::DecalStructure& structure); + // Draws a whole decal, with optional scale and tinting + void DrawDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a region of a decal, with optional scale and tinting + void DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + // Draws fully user controlled 4 vertices, pos(pixels), uv(pixels), colours + void DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements = 4); + // Draws a decal with 4 arbitrary points, warping the texture to look "correct" + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint = olc::WHITE); + // As above, but you can specify a region of a decal source sprite + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + // Draws a decal rotated to specified angle, wit point of rotation offset + void DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f, 1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a multiline string as a decal, with tiniting and scaling + void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Draws a single shaded filled rectangle as a decal + void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); + // Draws a corner shaded rectangle as a decal + void GradientFillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR); + // Draws an arbitrary convex textured polygon using GPU + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint = olc::WHITE); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& depth, const std::vector& uv, const olc::Pixel tint = olc::WHITE); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& tint); + + // Draws a line in Decal Space + void DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p = olc::WHITE); + void DrawRectDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p = olc::WHITE); + void DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Clears entire draw target to Pixel + void Clear(Pixel p); + // Clears the rendering back buffer + void ClearBuffer(Pixel p, bool bDepth = true); + // Returns the font image + olc::Sprite* GetFontSprite(); + + // Clip a line segment to visible area + bool ClipLineToScreen(olc::vi2d& in_p1, olc::vi2d& in_p2); + + // Dont allow PGE to mark layers as dirty, so pixel graphics don't update + void EnablePixelTransfer(const bool bEnable = true); + + // Command Console Routines + void ConsoleShow(const olc::Key &keyExit, bool bSuspendTime = true); + bool IsConsoleShowing() const; + void ConsoleClear(); + std::stringstream& ConsoleOut(); + void ConsoleCaptureStdOut(const bool bCapture); + + // Text Entry Routines + void TextEntryEnable(const bool bEnable, const std::string& sText = ""); + std::string TextEntryGetString() const; + int32_t TextEntryGetCursor() const; + bool IsTextEntryEnabled() const; + void SetFPSDisplay(bool display); + + + + private: + void UpdateTextEntry(); + void UpdateConsole(); + + public: + + // Experimental Lightweight 3D Routines ================ +#ifdef OLC_ENABLE_EXPERIMENTAL + // Set Manual View Matrix + void LW3D_View(const std::array& m); + // Set Manual World Matrix + void LW3D_World(const std::array& m); + // Set Manual Projection Matrix + void LW3D_Projection(const std::array& m); + + // Draws a vector of vertices, interprted as individual triangles + void LW3D_DrawTriangles(olc::Decal* decal, const std::vector>& pos, const std::vector& tex, const std::vector& col); + + void LW3D_ModelTranslate(const float x, const float y, const float z); + + // Camera convenience functions + void LW3D_SetCameraAtTarget(const float fEyeX, const float fEyeY, const float fEyeZ, + const float fTargetX, const float fTargetY, const float fTargetZ, + const float fUpX = 0.0f, const float fUpY = 1.0f, const float fUpZ = 0.0f); + void LW3D_SetCameraAlongDirection(const float fEyeX, const float fEyeY, const float fEyeZ, + const float fDirX, const float fDirY, const float fDirZ, + const float fUpX = 0.0f, const float fUpY = 1.0f, const float fUpZ = 0.0f); + + // 3D Rendering Flags + void LW3D_EnableDepthTest(const bool bEnableDepth); + void LW3D_EnableBackfaceCulling(const bool bEnableCull); +#endif + public: // Branding + std::string sAppName; + Renderable fontRenderable; + + private: // Inner mysterious workings + olc::Sprite* pDrawTarget = nullptr; + Pixel::Mode nPixelMode = Pixel::NORMAL; + float fBlendFactor = 1.0f; + olc::vi2d vScreenSize = { 256, 240 }; + olc::vf2d vInvScreenSize = { 1.0f / 256.0f, 1.0f / 240.0f }; + olc::vi2d vPixelSize = { 4, 4 }; + olc::vi2d vScreenPixelSize = { 4, 4 }; + olc::vi2d vMousePos = { 0, 0 }; + int32_t nMouseWheelDelta = 0; + olc::vi2d vMousePosCache = { 0, 0 }; + olc::vi2d vMouseWindowPos = { 0, 0 }; + int32_t nMouseWheelDeltaCache = 0; + olc::vi2d vWindowSize = { 0, 0 }; + olc::vi2d vViewPos = { 0, 0 }; + olc::vi2d vViewSize = { 0,0 }; + bool bFullScreen = false; + olc::vf2d vPixel = { 1.0f, 1.0f }; + bool bHasInputFocus = false; + bool bHasMouseFocus = false; + bool bEnableVSYNC = false; + float fFrameTimer = 1.0f; + float fLastElapsed = 0.0f; + int nFrameCount = 0; + bool showFPS = true; + bool bSuspendTextureTransfer = false; + std::vector vLayers; + uint8_t nTargetLayer = 0; + uint32_t nLastFPS = 0; + bool bPixelCohesion = false; + DecalMode nDecalMode = DecalMode::NORMAL; + DecalStructure nDecalStructure = DecalStructure::FAN; + std::function funcPixelMode; + std::chrono::time_point m_tp1, m_tp2; + std::vector vFontSpacing; + + // Command Console Specific + bool bConsoleShow = false; + bool bConsoleSuspendTime = false; + olc::Key keyConsoleExit = olc::Key::F1; + std::stringstream ssConsoleOutput; + std::streambuf* sbufOldCout = nullptr; + olc::vi2d vConsoleSize; + olc::vi2d vConsoleCursor = { 0,0 }; + olc::vf2d vConsoleCharacterScale = { 1.0f, 2.0f }; + std::vector sConsoleLines; + std::list sCommandHistory; + std::list::iterator sCommandHistoryIt; + + // Text Entry Specific + bool bTextEntryEnable = false; + std::string sTextEntryString = ""; + int32_t nTextEntryCursor = 0; + std::vector> vKeyboardMap; + + + + // State of keyboard + bool pKeyNewState[256] = { 0 }; + bool pKeyOldState[256] = { 0 }; + HWButton pKeyboardState[256] = { 0 }; + + // State of mouse + bool pMouseNewState[nMouseButtons] = { 0 }; + bool pMouseOldState[nMouseButtons] = { 0 }; + HWButton pMouseState[nMouseButtons] = { 0 }; + + // The main engine thread + void EngineThread(); + + + // If anything sets this flag to false, the engine + // "should" shut down gracefully + static std::atomic bAtomActive; + + public: + // "Break In" Functions + void olc_UpdateMouse(int32_t x, int32_t y); + void olc_UpdateMouseWheel(int32_t delta); + void olc_UpdateWindowSize(int32_t x, int32_t y); + void olc_UpdateViewport(); + void olc_ConstructFontSheet(); + void olc_CoreUpdate(); + void olc_PrepareEngine(); + void olc_UpdateMouseState(int32_t button, bool state); + void olc_UpdateKeyState(int32_t key, bool state); + void olc_UpdateMouseFocus(bool state); + void olc_UpdateKeyFocus(bool state); + void olc_Terminate(); + void olc_Reanimate(); + bool olc_IsRunning(); + + // At the very end of this file, chooses which + // components to compile + virtual void olc_ConfigureSystem(); + + // NOTE: Items Here are to be deprecated, I have left them in for now + // in case you are using them, but they will be removed. + // olc::vf2d vSubPixelOffset = { 0.0f, 0.0f }; + + public: // PGEX Stuff + friend class PGEX; + void pgex_Register(olc::PGEX* pgex); + + private: + std::vector vExtensions; + }; + + + + // O------------------------------------------------------------------------------O + // | PGE EXTENSION BASE CLASS - Permits access to PGE functions from extension | + // O------------------------------------------------------------------------------O + class PGEX + { + friend class olc::PixelGameEngine; + public: + PGEX(bool bHook = false); + + protected: + virtual void OnBeforeUserCreate(); + virtual void OnAfterUserCreate(); + virtual bool OnBeforeUserUpdate(float &fElapsedTime); + virtual void OnAfterUserUpdate(float fElapsedTime); + + protected: + static PixelGameEngine* pge; + }; +} + +#pragma endregion + +#endif // OLC_PGE_DEF + + +// O------------------------------------------------------------------------------O +// | START OF OLC_PGE_APPLICATION | +// O------------------------------------------------------------------------------O +#ifdef OLC_PGE_APPLICATION +#undef OLC_PGE_APPLICATION + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine INTERFACE IMPLEMENTATION (CORE) | +// | Note: The core implementation is platform independent | +// O------------------------------------------------------------------------------O +#pragma region pge_implementation +namespace olc +{ + // O------------------------------------------------------------------------------O + // | olc::Pixel IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Pixel::Pixel() + { r = 0; g = 0; b = 0; a = nDefaultAlpha; } + + Pixel::Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) + { n = red | (green << 8) | (blue << 16) | (alpha << 24); } // Thanks jarekpelczar + + Pixel::Pixel(uint32_t p) + { n = p; } + + bool Pixel::operator==(const Pixel& p) const + { return n == p.n; } + + bool Pixel::operator!=(const Pixel& p) const + { return n != p.n; } + + Pixel Pixel::operator * (const float i) const + { + float fR = std::min(255.0f, std::max(0.0f, float(r) * i)); + float fG = std::min(255.0f, std::max(0.0f, float(g) * i)); + float fB = std::min(255.0f, std::max(0.0f, float(b) * i)); + return Pixel(uint8_t(fR), uint8_t(fG), uint8_t(fB), a); + } + + Pixel Pixel::operator / (const float i) const + { + float fR = std::min(255.0f, std::max(0.0f, float(r) / i)); + float fG = std::min(255.0f, std::max(0.0f, float(g) / i)); + float fB = std::min(255.0f, std::max(0.0f, float(b) / i)); + return Pixel(uint8_t(fR), uint8_t(fG), uint8_t(fB), a); + } + + Pixel& Pixel::operator *=(const float i) + { + this->r = uint8_t(std::min(255.0f, std::max(0.0f, float(r) * i))); + this->g = uint8_t(std::min(255.0f, std::max(0.0f, float(g) * i))); + this->b = uint8_t(std::min(255.0f, std::max(0.0f, float(b) * i))); + return *this; + } + + Pixel& Pixel::operator /=(const float i) + { + this->r = uint8_t(std::min(255.0f, std::max(0.0f, float(r) / i))); + this->g = uint8_t(std::min(255.0f, std::max(0.0f, float(g) / i))); + this->b = uint8_t(std::min(255.0f, std::max(0.0f, float(b) / i))); + return *this; + } + + Pixel Pixel::operator + (const Pixel& p) const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, int(r) + int(p.r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, int(g) + int(p.g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, int(b) + int(p.b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel Pixel::operator - (const Pixel& p) const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, int(r) - int(p.r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, int(g) - int(p.g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, int(b) - int(p.b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel& Pixel::operator += (const Pixel& p) + { + this->r = uint8_t(std::min(255, std::max(0, int(r) + int(p.r)))); + this->g = uint8_t(std::min(255, std::max(0, int(g) + int(p.g)))); + this->b = uint8_t(std::min(255, std::max(0, int(b) + int(p.b)))); + return *this; + } + + Pixel& Pixel::operator -= (const Pixel& p) // Thanks Au Lit + { + this->r = uint8_t(std::min(255, std::max(0, int(r) - int(p.r)))); + this->g = uint8_t(std::min(255, std::max(0, int(g) - int(p.g)))); + this->b = uint8_t(std::min(255, std::max(0, int(b) - int(p.b)))); + return *this; + } + + Pixel Pixel::inv() const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, 255 - int(r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, 255 - int(g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, 255 - int(b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel PixelF(float red, float green, float blue, float alpha) + { return Pixel(uint8_t(red * 255.0f), uint8_t(green * 255.0f), uint8_t(blue * 255.0f), uint8_t(alpha * 255.0f)); } + + Pixel PixelLerp(const olc::Pixel& p1, const olc::Pixel& p2, float t) + { return (p2 * t) + p1 * (1.0f - t); } + + // O------------------------------------------------------------------------------O + // | olc::Sprite IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Sprite::Sprite() + { width = 0; height = 0; } + + Sprite::Sprite(const std::string& sImageFile, olc::ResourcePack* pack) + { LoadFromFile(sImageFile, pack); } + + Sprite::Sprite(int32_t w, int32_t h) + { + width = w; height = h; + pColData.resize(width * height); + pColData.resize(width * height, nDefaultPixel); + } + + Sprite::~Sprite() + { pColData.clear(); } + + void Sprite::SetSampleMode(olc::Sprite::Mode mode) + { modeSample = mode; } + + Pixel Sprite::GetPixel(const olc::vi2d& a) const + { return GetPixel(a.x, a.y); } + + bool Sprite::SetPixel(const olc::vi2d& a, Pixel p) + { return SetPixel(a.x, a.y, p); } + + Pixel Sprite::GetPixel(int32_t x, int32_t y) const + { + if (modeSample == olc::Sprite::Mode::NORMAL) + { + if (x >= 0 && x < width && y >= 0 && y < height) + return pColData[y * width + x]; + else + return Pixel(0, 0, 0, 0); + } + else + { + if (modeSample == olc::Sprite::Mode::PERIODIC) + return pColData[abs(y % height) * width + abs(x % width)]; + else + return pColData[std::max(0, std::min(y, height-1)) * width + std::max(0, std::min(x, width-1))]; + } + } + + bool Sprite::SetPixel(int32_t x, int32_t y, Pixel p) + { + if (x >= 0 && x < width && y >= 0 && y < height) + { + pColData[y * width + x] = p; + return true; + } + else + return false; + } + + Pixel Sprite::Sample(float x, float y) const + { + int32_t sx = std::min((int32_t)((x * (float)width)), width - 1); + int32_t sy = std::min((int32_t)((y * (float)height)), height - 1); + return GetPixel(sx, sy); + } + + Pixel Sprite::SampleBL(float u, float v) const + { + u = u * width - 0.5f; + v = v * height - 0.5f; + int x = (int)floor(u); // cast to int rounds toward zero, not downward + int y = (int)floor(v); // Thanks @joshinils + float u_ratio = u - x; + float v_ratio = v - y; + float u_opposite = 1 - u_ratio; + float v_opposite = 1 - v_ratio; + + olc::Pixel p1 = GetPixel(std::max(x, 0), std::max(y, 0)); + olc::Pixel p2 = GetPixel(std::min(x + 1, (int)width - 1), std::max(y, 0)); + olc::Pixel p3 = GetPixel(std::max(x, 0), std::min(y + 1, (int)height - 1)); + olc::Pixel p4 = GetPixel(std::min(x + 1, (int)width - 1), std::min(y + 1, (int)height - 1)); + + return olc::Pixel( + (uint8_t)((p1.r * u_opposite + p2.r * u_ratio) * v_opposite + (p3.r * u_opposite + p4.r * u_ratio) * v_ratio), + (uint8_t)((p1.g * u_opposite + p2.g * u_ratio) * v_opposite + (p3.g * u_opposite + p4.g * u_ratio) * v_ratio), + (uint8_t)((p1.b * u_opposite + p2.b * u_ratio) * v_opposite + (p3.b * u_opposite + p4.b * u_ratio) * v_ratio)); + } + + Pixel* Sprite::GetData() + { return pColData.data(); } + + + olc::rcode Sprite::LoadFromFile(const std::string& sImageFile, olc::ResourcePack* pack) + { + UNUSED(pack); + return loader->LoadImageResource(this, sImageFile, pack); + } + + olc::Sprite* Sprite::Duplicate() + { + olc::Sprite* spr = new olc::Sprite(width, height); + std::memcpy(spr->GetData(), GetData(), width * height * sizeof(olc::Pixel)); + spr->modeSample = modeSample; + return spr; + } + + olc::Sprite* Sprite::Duplicate(const olc::vi2d& vPos, const olc::vi2d& vSize) + { + olc::Sprite* spr = new olc::Sprite(vSize.x, vSize.y); + for (int y = 0; y < vSize.y; y++) + for (int x = 0; x < vSize.x; x++) + spr->SetPixel(x, y, GetPixel(vPos.x + x, vPos.y + y)); + return spr; + } + + // O------------------------------------------------------------------------------O + // | olc::Decal IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Decal::Decal(olc::Sprite* spr, bool filter, bool clamp) + { + id = -1; + if (spr == nullptr) return; + sprite = spr; + id = renderer->CreateTexture(sprite->width, sprite->height, filter, clamp); + Update(); + } + + Decal::Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr) + { + if (spr == nullptr) return; + id = nExistingTextureResource; + } + + void Decal::Update() + { + if (sprite == nullptr) return; + vUVScale = { 1.0f / float(sprite->width), 1.0f / float(sprite->height) }; + renderer->ApplyTexture(id); + renderer->UpdateTexture(id, sprite); + } + + void Decal::UpdateSprite() + { + if (sprite == nullptr) return; + renderer->ApplyTexture(id); + renderer->ReadTexture(id, sprite); + } + + Decal::~Decal() + { + if (id != -1) + { + renderer->DeleteTexture(id); + id = -1; + } + } + + void Renderable::Create(uint32_t width, uint32_t height, bool filter, bool clamp) + { + pSprite = std::make_unique(width, height); + pDecal = std::make_unique(pSprite.get(), filter, clamp); + } + + olc::rcode Renderable::Load(const std::string& sFile, ResourcePack* pack, bool filter, bool clamp) + { + pSprite = std::make_unique(); + if (pSprite->LoadFromFile(sFile, pack) == olc::rcode::OK) + { + pDecal = std::make_unique(pSprite.get(), filter, clamp); + return olc::rcode::OK; + } + else + { + pSprite.release(); + pSprite = nullptr; + return olc::rcode::NO_FILE; + } + } + + olc::Decal* Renderable::Decal() const + { return pDecal.get(); } + + olc::Sprite* Renderable::Sprite() const + { return pSprite.get(); } + + // O------------------------------------------------------------------------------O + // | olc::ResourcePack IMPLEMENTATION | + // O------------------------------------------------------------------------------O + + + //============================================================= + // Resource Packs - Allows you to store files in one large + // scrambled file - Thanks MaGetzUb for debugging a null char in std::stringstream bug + ResourceBuffer::ResourceBuffer(std::ifstream& ifs, uint32_t offset, uint32_t size) + { + vMemory.resize(size); + ifs.seekg(offset); ifs.read(vMemory.data(), vMemory.size()); + setg(vMemory.data(), vMemory.data(), vMemory.data() + size); + } + + ResourcePack::ResourcePack() { } + ResourcePack::~ResourcePack() { baseFile.close(); } + + bool ResourcePack::AddFile(const std::string& sFile) + { + const std::string file = makeposix(sFile); + + if (_gfs::exists(file)) + { + sResourceFile e; + e.nSize = (uint32_t)_gfs::file_size(file); + e.nOffset = 0; // Unknown at this stage + mapFiles[file] = e; + return true; + } + return false; + } + + bool ResourcePack::LoadPack(const std::string& sFile, const std::string& sKey) + { + // Open the resource file + baseFile.open(sFile, std::ifstream::binary); + if (!baseFile.is_open()) return false; + + // 1) Read Scrambled index + uint32_t nIndexSize = 0; + baseFile.read((char*)&nIndexSize, sizeof(uint32_t)); + + std::vector buffer(nIndexSize); + for (uint32_t j = 0; j < nIndexSize; j++) + buffer[j] = baseFile.get(); + + std::vector decoded = scramble(buffer, sKey); + size_t pos = 0; + auto read = [&decoded, &pos](char* dst, size_t size) { + memcpy((void*)dst, (const void*)(decoded.data() + pos), size); + pos += size; + }; + + auto get = [&read]() -> int { char c; read(&c, 1); return c; }; + + // 2) Read Map + uint32_t nMapEntries = 0; + read((char*)&nMapEntries, sizeof(uint32_t)); + for (uint32_t i = 0; i < nMapEntries; i++) + { + uint32_t nFilePathSize = 0; + read((char*)&nFilePathSize, sizeof(uint32_t)); + + std::string sFileName(nFilePathSize, ' '); + for (uint32_t j = 0; j < nFilePathSize; j++) + sFileName[j] = get(); + + sResourceFile e; + read((char*)&e.nSize, sizeof(uint32_t)); + read((char*)&e.nOffset, sizeof(uint32_t)); + mapFiles[sFileName] = e; + } + + // Don't close base file! we will provide a stream + // pointer when the file is requested + return true; + } + + bool ResourcePack::SavePack(const std::string& sFile, const std::string& sKey) + { + // Create/Overwrite the resource file + std::ofstream ofs(sFile, std::ofstream::binary); + if (!ofs.is_open()) return false; + + // Iterate through map + uint32_t nIndexSize = 0; // Unknown for now + ofs.write((char*)&nIndexSize, sizeof(uint32_t)); + uint32_t nMapSize = uint32_t(mapFiles.size()); + ofs.write((char*)&nMapSize, sizeof(uint32_t)); + for (auto& e : mapFiles) + { + // Write the path of the file + size_t nPathSize = e.first.size(); + ofs.write((char*)&nPathSize, sizeof(uint32_t)); + ofs.write(e.first.c_str(), nPathSize); + + // Write the file entry properties + ofs.write((char*)&e.second.nSize, sizeof(uint32_t)); + ofs.write((char*)&e.second.nOffset, sizeof(uint32_t)); + } + + // 2) Write the individual Data + std::streampos offset = ofs.tellp(); + nIndexSize = (uint32_t)offset; + for (auto& e : mapFiles) + { + // Store beginning of file offset within resource pack file + e.second.nOffset = (uint32_t)offset; + + // Load the file to be added + std::vector vBuffer(e.second.nSize); + std::ifstream i(e.first, std::ifstream::binary); + i.read((char*)vBuffer.data(), e.second.nSize); + i.close(); + + // Write the loaded file into resource pack file + ofs.write((char*)vBuffer.data(), e.second.nSize); + offset += e.second.nSize; + } + + // 3) Scramble Index + std::vector stream; + auto write = [&stream](const char* data, size_t size) { + size_t sizeNow = stream.size(); + stream.resize(sizeNow + size); + memcpy(stream.data() + sizeNow, data, size); + }; + + // Iterate through map + write((char*)&nMapSize, sizeof(uint32_t)); + for (auto& e : mapFiles) + { + // Write the path of the file + size_t nPathSize = e.first.size(); + write((char*)&nPathSize, sizeof(uint32_t)); + write(e.first.c_str(), nPathSize); + + // Write the file entry properties + write((char*)&e.second.nSize, sizeof(uint32_t)); + write((char*)&e.second.nOffset, sizeof(uint32_t)); + } + std::vector sIndexString = scramble(stream, sKey); + uint32_t nIndexStringLen = uint32_t(sIndexString.size()); + // 4) Rewrite Map (it has been updated with offsets now) + // at start of file + ofs.seekp(0, std::ios::beg); + ofs.write((char*)&nIndexStringLen, sizeof(uint32_t)); + ofs.write(sIndexString.data(), nIndexStringLen); + ofs.close(); + return true; + } + + ResourceBuffer ResourcePack::GetFileBuffer(const std::string& sFile) + { return ResourceBuffer(baseFile, mapFiles[sFile].nOffset, mapFiles[sFile].nSize); } + + bool ResourcePack::Loaded() + { return baseFile.is_open(); } + + std::vector ResourcePack::scramble(const std::vector& data, const std::string& key) + { + if (key.empty()) return data; + std::vector o; + size_t c = 0; + for (auto s : data) o.push_back(s ^ key[(c++) % key.size()]); + return o; + }; + + std::string ResourcePack::makeposix(const std::string& path) + { + std::string o; + for (auto s : path) o += std::string(1, s == '\\' ? '/' : s); + return o; + }; + + // O------------------------------------------------------------------------------O + // | olc::PixelGameEngine IMPLEMENTATION | + // O------------------------------------------------------------------------------O + PixelGameEngine::PixelGameEngine() + { + sAppName = "Undefined"; + olc::PGEX::pge = this; + + // Bring in relevant Platform & Rendering systems depending + // on compiler parameters + olc_ConfigureSystem(); + } + + PixelGameEngine::~PixelGameEngine() + {} + + + olc::rcode PixelGameEngine::Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, bool full_screen, bool vsync, bool cohesion) + { + bPixelCohesion = cohesion; + vScreenSize = { screen_w, screen_h }; + vInvScreenSize = { 1.0f / float(screen_w), 1.0f / float(screen_h) }; + vPixelSize = { pixel_w, pixel_h }; + vWindowSize = vScreenSize * vPixelSize; + bFullScreen = full_screen; + bEnableVSYNC = vsync; + vPixel = 2.0f / vScreenSize; + + if (vPixelSize.x <= 0 || vPixelSize.y <= 0 || vScreenSize.x <= 0 || vScreenSize.y <= 0) + return olc::FAIL; + return olc::OK; + } + + + void PixelGameEngine::SetScreenSize(int w, int h) + { + vScreenSize = { w, h }; + vInvScreenSize = { 1.0f / float(w), 1.0f / float(h) }; + for (auto& layer : vLayers) + { + layer.pDrawTarget.Create(vScreenSize.x, vScreenSize.y); + layer.bUpdate = true; + } + SetDrawTarget(nullptr); + renderer->ClearBuffer(olc::BLACK, true); + renderer->DisplayFrame(); + renderer->ClearBuffer(olc::BLACK, true); + renderer->UpdateViewport(vViewPos, vViewSize); + } + +#if !defined(PGE_USE_CUSTOM_START) + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + // Start the thread + bAtomActive = true; + std::thread t = std::thread(&PixelGameEngine::EngineThread, this); + + // Some implementations may form an event loop here + platform->StartSystemEventLoop(); + + // Wait for thread to be exited + t.join(); + + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + + return olc::OK; + } +#endif + + void PixelGameEngine::SetDrawTarget(Sprite* target) + { + if (target) + { + pDrawTarget = target; + } + else + { + nTargetLayer = 0; + pDrawTarget = vLayers[0].pDrawTarget.Sprite(); + } + } + + void PixelGameEngine::SetDrawTarget(uint8_t layer, bool bDirty) + { + if (layer < vLayers.size()) + { + pDrawTarget = vLayers[layer].pDrawTarget.Sprite(); + vLayers[layer].bUpdate = bDirty; + nTargetLayer = layer; + } + } + + void PixelGameEngine::EnableLayer(uint8_t layer, bool b) + { if (layer < vLayers.size()) vLayers[layer].bShow = b; } + + void PixelGameEngine::SetLayerOffset(uint8_t layer, const olc::vf2d& offset) + { SetLayerOffset(layer, offset.x, offset.y); } + + void PixelGameEngine::SetLayerOffset(uint8_t layer, float x, float y) + { if (layer < vLayers.size()) vLayers[layer].vOffset = { x, y }; } + + void PixelGameEngine::SetLayerScale(uint8_t layer, const olc::vf2d& scale) + { SetLayerScale(layer, scale.x, scale.y); } + + void PixelGameEngine::SetLayerScale(uint8_t layer, float x, float y) + { if (layer < vLayers.size()) vLayers[layer].vScale = { x, y }; } + + void PixelGameEngine::SetLayerTint(uint8_t layer, const olc::Pixel& tint) + { if (layer < vLayers.size()) vLayers[layer].tint = tint; } + + void PixelGameEngine::SetLayerCustomRenderFunction(uint8_t layer, std::function f) + { if (layer < vLayers.size()) vLayers[layer].funcHook = f; } + + std::vector& PixelGameEngine::GetLayers() + { return vLayers; } + + uint32_t PixelGameEngine::CreateLayer() + { + LayerDesc ld; + ld.pDrawTarget.Create(vScreenSize.x, vScreenSize.y); + vLayers.push_back(std::move(ld)); + return uint32_t(vLayers.size()) - 1; + } + + Sprite* PixelGameEngine::GetDrawTarget() const + { return pDrawTarget; } + + int32_t PixelGameEngine::GetDrawTargetWidth() const + { + if (pDrawTarget) + return pDrawTarget->width; + else + return 0; + } + + int32_t PixelGameEngine::GetDrawTargetHeight() const + { + if (pDrawTarget) + return pDrawTarget->height; + else + return 0; + } + + uint32_t PixelGameEngine::GetFPS() const + { return nLastFPS; } + + bool PixelGameEngine::IsFocused() const + { return bHasInputFocus; } + + HWButton PixelGameEngine::GetKey(Key k) const + { return pKeyboardState[k]; } + + HWButton PixelGameEngine::GetMouse(uint32_t b) const + { return pMouseState[b]; } + + int32_t PixelGameEngine::GetMouseX() const + { return vMousePos.x; } + + int32_t PixelGameEngine::GetMouseY() const + { return vMousePos.y; } + + const olc::vi2d& PixelGameEngine::GetMousePos() const + { return vMousePos; } + + int32_t PixelGameEngine::GetMouseWheel() const + { return nMouseWheelDelta; } + + int32_t PixelGameEngine::ScreenWidth() const + { return vScreenSize.x; } + + int32_t PixelGameEngine::ScreenHeight() const + { return vScreenSize.y; } + + float PixelGameEngine::GetElapsedTime() const + { return fLastElapsed; } + + const olc::vi2d& PixelGameEngine::GetWindowSize() const + { return vWindowSize; } + + const olc::vi2d& PixelGameEngine::GetPixelSize() const + { return vPixelSize; } + + const olc::vi2d& PixelGameEngine::GetScreenPixelSize() const + { return vScreenPixelSize; } + + const olc::vi2d& PixelGameEngine::GetWindowMouse() const + { return vMouseWindowPos; } + + bool PixelGameEngine::Draw(const olc::vi2d& pos, Pixel p) + { return Draw(pos.x, pos.y, p); } + + // This is it, the critical function that plots a pixel + bool PixelGameEngine::Draw(int32_t x, int32_t y, Pixel p) + { + if (!pDrawTarget) return false; + + if (nPixelMode == Pixel::NORMAL) + { + return pDrawTarget->SetPixel(x, y, p); + } + + if (nPixelMode == Pixel::MASK) + { + if (p.a == 255) + return pDrawTarget->SetPixel(x, y, p); + } + + if (nPixelMode == Pixel::ALPHA) + { + Pixel d = pDrawTarget->GetPixel(x, y); + float a = (float)(p.a / 255.0f) * fBlendFactor; + float c = 1.0f - a; + float r = a * (float)p.r + c * (float)d.r; + float g = a * (float)p.g + c * (float)d.g; + float b = a * (float)p.b + c * (float)d.b; + return pDrawTarget->SetPixel(x, y, Pixel((uint8_t)r, (uint8_t)g, (uint8_t)b/*, (uint8_t)(p.a * fBlendFactor)*/)); + } + + if (nPixelMode == Pixel::CUSTOM) + { + return pDrawTarget->SetPixel(x, y, funcPixelMode(x, y, p, pDrawTarget->GetPixel(x, y))); + } + + return false; + } + + + void PixelGameEngine::DrawLine(const olc::vi2d& pos1, const olc::vi2d& pos2, Pixel p, uint32_t pattern) + { DrawLine(pos1.x, pos1.y, pos2.x, pos2.y, p, pattern); } + + void PixelGameEngine::DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p, uint32_t pattern) + { + int x, y, dx, dy, dx1, dy1, px, py, xe, ye, i; + dx = x2 - x1; dy = y2 - y1; + + auto rol = [&](void) { pattern = (pattern << 1) | (pattern >> 31); return pattern & 1; }; + + olc::vi2d p1(x1, y1), p2(x2, y2); + //if (!ClipLineToScreen(p1, p2)) + // return; + x1 = p1.x; y1 = p1.y; + x2 = p2.x; y2 = p2.y; + + // straight lines idea by gurkanctn + if (dx == 0) // Line is vertical + { + if (y2 < y1) std::swap(y1, y2); + for (y = y1; y <= y2; y++) if (rol()) Draw(x1, y, p); + return; + } + + if (dy == 0) // Line is horizontal + { + if (x2 < x1) std::swap(x1, x2); + for (x = x1; x <= x2; x++) if (rol()) Draw(x, y1, p); + return; + } + + // Line is Funk-aye + dx1 = abs(dx); dy1 = abs(dy); + px = 2 * dy1 - dx1; py = 2 * dx1 - dy1; + if (dy1 <= dx1) + { + if (dx >= 0) + { + x = x1; y = y1; xe = x2; + } + else + { + x = x2; y = y2; xe = x1; + } + + if (rol()) Draw(x, y, p); + + for (i = 0; x < xe; i++) + { + x = x + 1; + if (px < 0) + px = px + 2 * dy1; + else + { + if ((dx < 0 && dy < 0) || (dx > 0 && dy > 0)) y = y + 1; else y = y - 1; + px = px + 2 * (dy1 - dx1); + } + if (rol()) Draw(x, y, p); + } + } + else + { + if (dy >= 0) + { + x = x1; y = y1; ye = y2; + } + else + { + x = x2; y = y2; ye = y1; + } + + if (rol()) Draw(x, y, p); + + for (i = 0; y < ye; i++) + { + y = y + 1; + if (py <= 0) + py = py + 2 * dx1; + else + { + if ((dx < 0 && dy < 0) || (dx > 0 && dy > 0)) x = x + 1; else x = x - 1; + py = py + 2 * (dx1 - dy1); + } + if (rol()) Draw(x, y, p); + } + } + } + + void PixelGameEngine::DrawCircle(const olc::vi2d& pos, int32_t radius, Pixel p, uint8_t mask) + { DrawCircle(pos.x, pos.y, radius, p, mask); } + + void PixelGameEngine::DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p, uint8_t mask) + { // Thanks to IanM-Matrix1 #PR121 + if (radius < 0 || x < -radius || y < -radius || x - GetDrawTargetWidth() > radius || y - GetDrawTargetHeight() > radius) + return; + + if (radius > 0) + { + int x0 = 0; + int y0 = radius; + int d = 3 - 2 * radius; + + while (y0 >= x0) // only formulate 1/8 of circle + { + // Draw even octants + if (mask & 0x01) Draw(x + x0, y - y0, p);// Q6 - upper right right + if (mask & 0x04) Draw(x + y0, y + x0, p);// Q4 - lower lower right + if (mask & 0x10) Draw(x - x0, y + y0, p);// Q2 - lower left left + if (mask & 0x40) Draw(x - y0, y - x0, p);// Q0 - upper upper left + if (x0 != 0 && x0 != y0) + { + if (mask & 0x02) Draw(x + y0, y - x0, p);// Q7 - upper upper right + if (mask & 0x08) Draw(x + x0, y + y0, p);// Q5 - lower right right + if (mask & 0x20) Draw(x - y0, y + x0, p);// Q3 - lower lower left + if (mask & 0x80) Draw(x - x0, y - y0, p);// Q1 - upper left left + } + + if (d < 0) + d += 4 * x0++ + 6; + else + d += 4 * (x0++ - y0--) + 10; + } + } + else + Draw(x, y, p); + } + + void PixelGameEngine::FillCircle(const olc::vi2d& pos, int32_t radius, Pixel p) + { FillCircle(pos.x, pos.y, radius, p); } + + void PixelGameEngine::FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p) + { // Thanks to IanM-Matrix1 #PR121 + if (radius < 0 || x < -radius || y < -radius || x - GetDrawTargetWidth() > radius || y - GetDrawTargetHeight() > radius) + return; + + if (radius > 0) + { + int x0 = 0; + int y0 = radius; + int d = 3 - 2 * radius; + + auto drawline = [&](int sx, int ex, int y) + { + for (int x = sx; x <= ex; x++) + Draw(x, y, p); + }; + + while (y0 >= x0) + { + drawline(x - y0, x + y0, y - x0); + if (x0 > 0) drawline(x - y0, x + y0, y + x0); + + if (d < 0) + d += 4 * x0++ + 6; + else + { + if (x0 != y0) + { + drawline(x - x0, x + x0, y - y0); + drawline(x - x0, x + x0, y + y0); + } + d += 4 * (x0++ - y0--) + 10; + } + } + } + else + Draw(x, y, p); + } + + void PixelGameEngine::DrawRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p) + { DrawRect(pos.x, pos.y, size.x, size.y, p); } + + void PixelGameEngine::DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p) + { + DrawLine(x, y, x + w, y, p); + DrawLine(x + w, y, x + w, y + h, p); + DrawLine(x + w, y + h, x, y + h, p); + DrawLine(x, y + h, x, y, p); + } + + void PixelGameEngine::Clear(Pixel p) + { + int pixels = GetDrawTargetWidth() * GetDrawTargetHeight(); + Pixel* m = GetDrawTarget()->GetData(); + for (int i = 0; i < pixels; i++) m[i] = p; + } + + void PixelGameEngine::ClearBuffer(Pixel p, bool bDepth) + { renderer->ClearBuffer(p, bDepth); } + + olc::Sprite* PixelGameEngine::GetFontSprite() + { return fontRenderable.Sprite(); } + + bool PixelGameEngine::ClipLineToScreen(olc::vi2d& in_p1, olc::vi2d& in_p2) + { + // https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm + static constexpr int SEG_I = 0b0000, SEG_L = 0b0001, SEG_R = 0b0010, SEG_B = 0b0100, SEG_T = 0b1000; + auto Segment = [&vScreenSize = vScreenSize](const olc::vi2d& v) + { + int i = SEG_I; + if (v.x < 0) i |= SEG_L; else if (v.x > vScreenSize.x) i |= SEG_R; + if (v.y < 0) i |= SEG_B; else if (v.y > vScreenSize.y) i |= SEG_T; + return i; + }; + + int s1 = Segment(in_p1), s2 = Segment(in_p2); + + while (true) + { + if (!(s1 | s2)) return true; + else if (s1 & s2) return false; + else + { + int s3 = s2 > s1 ? s2 : s1; + olc::vi2d n; + if (s3 & SEG_T) { n.x = in_p1.x + (in_p2.x - in_p1.x) * (vScreenSize.y - in_p1.y) / (in_p2.y - in_p1.y); n.y = vScreenSize.y; } + else if (s3 & SEG_B) { n.x = in_p1.x + (in_p2.x - in_p1.x) * (0 - in_p1.y) / (in_p2.y - in_p1.y); n.y = 0; } + else if (s3 & SEG_R) { n.x = vScreenSize.x; n.y = in_p1.y + (in_p2.y - in_p1.y) * (vScreenSize.x - in_p1.x) / (in_p2.x - in_p1.x); } + else if (s3 & SEG_L) { n.x = 0; n.y = in_p1.y + (in_p2.y - in_p1.y) * (0 - in_p1.x) / (in_p2.x - in_p1.x); } + if (s3 == s1) { in_p1 = n; s1 = Segment(in_p1); } + else { in_p2 = n; s2 = Segment(in_p2); } + } + } + return true; + } + + void PixelGameEngine::EnablePixelTransfer(const bool bEnable) + { + bSuspendTextureTransfer = !bEnable; + } + + + void PixelGameEngine::FillRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p) + { FillRect(pos.x, pos.y, size.x, size.y, p); } + + void PixelGameEngine::FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p) + { + int32_t x2 = x + w; + int32_t y2 = y + h; + + if (x < 0) x = 0; + if (x >= (int32_t)GetDrawTargetWidth()) x = (int32_t)GetDrawTargetWidth(); + if (y < 0) y = 0; + if (y >= (int32_t)GetDrawTargetHeight()) y = (int32_t)GetDrawTargetHeight(); + + if (x2 < 0) x2 = 0; + if (x2 >= (int32_t)GetDrawTargetWidth()) x2 = (int32_t)GetDrawTargetWidth(); + if (y2 < 0) y2 = 0; + if (y2 >= (int32_t)GetDrawTargetHeight()) y2 = (int32_t)GetDrawTargetHeight(); + + for (int i = x; i < x2; i++) + for (int j = y; j < y2; j++) + Draw(i, j, p); + } + + void PixelGameEngine::DrawTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p) + { DrawTriangle(pos1.x, pos1.y, pos2.x, pos2.y, pos3.x, pos3.y, p); } + + void PixelGameEngine::DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p) + { + DrawLine(x1, y1, x2, y2, p); + DrawLine(x2, y2, x3, y3, p); + DrawLine(x3, y3, x1, y1, p); + } + + void PixelGameEngine::FillTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p) + { FillTriangle(pos1.x, pos1.y, pos2.x, pos2.y, pos3.x, pos3.y, p); } + + // https://www.avrfreaks.net/sites/default/files/triangles.c + void PixelGameEngine::FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p) + { + auto drawline = [&](int sx, int ex, int ny) { for (int i = sx; i <= ex; i++) Draw(i, ny, p); }; + + int t1x, t2x, y, minx, maxx, t1xp, t2xp; + bool changed1 = false; + bool changed2 = false; + int signx1, signx2, dx1, dy1, dx2, dy2; + int e1, e2; + // Sort vertices + if (y1 > y2) { std::swap(y1, y2); std::swap(x1, x2); } + if (y1 > y3) { std::swap(y1, y3); std::swap(x1, x3); } + if (y2 > y3) { std::swap(y2, y3); std::swap(x2, x3); } + + t1x = t2x = x1; y = y1; // Starting points + dx1 = (int)(x2 - x1); + if (dx1 < 0) { dx1 = -dx1; signx1 = -1; } + else signx1 = 1; + dy1 = (int)(y2 - y1); + + dx2 = (int)(x3 - x1); + if (dx2 < 0) { dx2 = -dx2; signx2 = -1; } + else signx2 = 1; + dy2 = (int)(y3 - y1); + + if (dy1 > dx1) { std::swap(dx1, dy1); changed1 = true; } + if (dy2 > dx2) { std::swap(dy2, dx2); changed2 = true; } + + e2 = (int)(dx2 >> 1); + // Flat top, just process the second half + if (y1 == y2) goto next; + e1 = (int)(dx1 >> 1); + + for (int i = 0; i < dx1;) { + t1xp = 0; t2xp = 0; + if (t1x < t2x) { minx = t1x; maxx = t2x; } + else { minx = t2x; maxx = t1x; } + // process first line until y value is about to change + while (i < dx1) { + i++; + e1 += dy1; + while (e1 >= dx1) { + e1 -= dx1; + if (changed1) t1xp = signx1;//t1x += signx1; + else goto next1; + } + if (changed1) break; + else t1x += signx1; + } + // Move line + next1: + // process second line until y value is about to change + while (1) { + e2 += dy2; + while (e2 >= dx2) { + e2 -= dx2; + if (changed2) t2xp = signx2;//t2x += signx2; + else goto next2; + } + if (changed2) break; + else t2x += signx2; + } + next2: + if (minx > t1x) minx = t1x; + if (minx > t2x) minx = t2x; + if (maxx < t1x) maxx = t1x; + if (maxx < t2x) maxx = t2x; + drawline(minx, maxx, y); // Draw line from min to max points found on the y + // Now increase y + if (!changed1) t1x += signx1; + t1x += t1xp; + if (!changed2) t2x += signx2; + t2x += t2xp; + y += 1; + if (y == y2) break; + } + next: + // Second half + dx1 = (int)(x3 - x2); if (dx1 < 0) { dx1 = -dx1; signx1 = -1; } + else signx1 = 1; + dy1 = (int)(y3 - y2); + t1x = x2; + + if (dy1 > dx1) { // swap values + std::swap(dy1, dx1); + changed1 = true; + } + else changed1 = false; + + e1 = (int)(dx1 >> 1); + + for (int i = 0; i <= dx1; i++) { + t1xp = 0; t2xp = 0; + if (t1x < t2x) { minx = t1x; maxx = t2x; } + else { minx = t2x; maxx = t1x; } + // process first line until y value is about to change + while (i < dx1) { + e1 += dy1; + while (e1 >= dx1) { + e1 -= dx1; + if (changed1) { t1xp = signx1; break; }//t1x += signx1; + else goto next3; + } + if (changed1) break; + else t1x += signx1; + if (i < dx1) i++; + } + next3: + // process second line until y value is about to change + while (t2x != x3) { + e2 += dy2; + while (e2 >= dx2) { + e2 -= dx2; + if (changed2) t2xp = signx2; + else goto next4; + } + if (changed2) break; + else t2x += signx2; + } + next4: + + if (minx > t1x) minx = t1x; + if (minx > t2x) minx = t2x; + if (maxx < t1x) maxx = t1x; + if (maxx < t2x) maxx = t2x; + drawline(minx, maxx, y); + if (!changed1) t1x += signx1; + t1x += t1xp; + if (!changed2) t2x += signx2; + t2x += t2xp; + y += 1; + if (y > y3) return; + } + } + + void PixelGameEngine::DrawSprite(const olc::vi2d& pos, Sprite* sprite, uint32_t scale, uint8_t flip) + { DrawSprite(pos.x, pos.y, sprite, scale, flip); } + + void PixelGameEngine::DrawSprite(int32_t x, int32_t y, Sprite* sprite, uint32_t scale, uint8_t flip) + { + if (sprite == nullptr) + return; + + int32_t fxs = 0, fxm = 1, fx = 0; + int32_t fys = 0, fym = 1, fy = 0; + if (flip & olc::Sprite::Flip::HORIZ) { fxs = sprite->width - 1; fxm = -1; } + if (flip & olc::Sprite::Flip::VERT) { fys = sprite->height - 1; fym = -1; } + + if (scale > 1) + { + fx = fxs; + for (int32_t i = 0; i < sprite->width; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < sprite->height; j++, fy += fym) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + (i * scale) + is, y + (j * scale) + js, sprite->GetPixel(fx, fy)); + } + } + else + { + fx = fxs; + for (int32_t i = 0; i < sprite->width; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < sprite->height; j++, fy += fym) + Draw(x + i, y + j, sprite->GetPixel(fx, fy)); + } + } + } + + void PixelGameEngine::DrawPartialSprite(const olc::vi2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, uint32_t scale, uint8_t flip) + { DrawPartialSprite(pos.x, pos.y, sprite, sourcepos.x, sourcepos.y, size.x, size.y, scale, flip); } + + void PixelGameEngine::DrawPartialSprite(int32_t x, int32_t y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, uint32_t scale, uint8_t flip) + { + if (sprite == nullptr) + return; + + int32_t fxs = 0, fxm = 1, fx = 0; + int32_t fys = 0, fym = 1, fy = 0; + if (flip & olc::Sprite::Flip::HORIZ) { fxs = w - 1; fxm = -1; } + if (flip & olc::Sprite::Flip::VERT) { fys = h - 1; fym = -1; } + + if (scale > 1) + { + fx = fxs; + for (int32_t i = 0; i < w; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < h; j++, fy += fym) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + (i * scale) + is, y + (j * scale) + js, sprite->GetPixel(fx + ox, fy + oy)); + } + } + else + { + fx = fxs; + for (int32_t i = 0; i < w; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < h; j++, fy += fym) + Draw(x + i, y + j, sprite->GetPixel(fx + ox, fy + oy)); + } + } + } + + void PixelGameEngine::SetDecalMode(const olc::DecalMode& mode) + { nDecalMode = mode; } + + void PixelGameEngine::SetDecalStructure(const olc::DecalStructure& structure) + { nDecalStructure = structure; } + + void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + -((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) + }; + + + olc::vf2d vScreenSpaceDim = + { + ((pos.x + source_size.x * scale.x) * vInvScreenSize.x) * 2.0f - 1.0f, + -(((pos.y + source_size.y * scale.y) * vInvScreenSize.y) * 2.0f - 1.0f) + }; + + olc::vf2d vWindow = olc::vf2d(vViewSize); + olc::vf2d vQuantisedPos = ((vScreenSpacePos * vWindow) + olc::vf2d(0.5f, 0.5f)).floor() / vWindow; + olc::vf2d vQuantisedDim = ((vScreenSpaceDim * vWindow) + olc::vf2d(0.5f, -0.5f)).ceil() / vWindow; + + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vQuantisedPos.x, vQuantisedPos.y }, { vQuantisedPos.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedPos.y } }; + olc::vf2d uvtl = (source_pos + olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; + olc::vf2d uvbr = (source_pos + source_size - olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.w = { 1,1,1,1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + ((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f + }; + + olc::vf2d vScreenSpaceDim = + { + vScreenSpacePos.x + (2.0f * size.x * vInvScreenSize.x), + vScreenSpacePos.y - (2.0f * size.y * vInvScreenSize.y) + }; + + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vScreenSpacePos.x, vScreenSpacePos.y }, { vScreenSpacePos.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpacePos.y } }; + olc::vf2d uvtl = (source_pos) * decal->vUVScale; + olc::vf2d uvbr = uvtl + ((source_size) * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.w = { 1,1,1,1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + + void PixelGameEngine::DrawDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + ((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f + }; + + olc::vf2d vScreenSpaceDim = + { + vScreenSpacePos.x + (2.0f * (float(decal->sprite->width) * vInvScreenSize.x)) * scale.x, + vScreenSpacePos.y - (2.0f * (float(decal->sprite->height) * vInvScreenSize.y)) * scale.y + }; + + DecalInstance di; + di.decal = decal; + di.points = 4; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vScreenSpacePos.x, vScreenSpacePos.y }, { vScreenSpacePos.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpacePos.y } }; + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + di.w = { 1, 1, 1, 1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements) + { + DecalInstance di; + di.decal = decal; + di.pos.resize(elements); + di.uv.resize(elements); + di.w.resize(elements); + di.tint.resize(elements); + di.points = elements; + for (uint32_t i = 0; i < elements; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = col[i]; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector &tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint[i]; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& depth, const std::vector& uv, const olc::Pixel tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + +#ifdef OLC_ENABLE_EXPERIMENTAL + // Lightweight 3D + void PixelGameEngine::LW3D_DrawTriangles(olc::Decal* decal, const std::vector>& pos, const std::vector& tex, const std::vector& col) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { pos[i][0], pos[i][1] }; + di.w[i] = pos[i][2]; + di.uv[i] = tex[i]; + di.tint[i] = col[i]; + } + di.mode = DecalMode::MODEL3D; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } +#endif + + void PixelGameEngine::DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p) + { + DecalInstance di; + di.decal = nullptr; + di.points = uint32_t(2); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + di.pos[0] = { (pos1.x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos1.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[0] = { 0.0f, 0.0f }; + di.tint[0] = p; + di.w[0] = 1.0f; + di.pos[1] = { (pos2.x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos2.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[1] = { 0.0f, 0.0f }; + di.tint[1] = p; + di.w[1] = 1.0f; + di.mode = olc::DecalMode::WIREFRAME; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col) { + DrawLineDecal(pos,{pos.x+size.x,pos.y},col); + DrawLineDecal({pos.x,pos.y},{pos.x,pos.y+size.y},col); + DrawLineDecal({pos.x,pos.y+size.y},{pos.x+size.x,pos.y+size.y},col); + DrawLineDecal({pos.x+size.x,pos.y},{pos.x+size.x,pos.y+size.y},col); + } + + void PixelGameEngine::FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col) + { + olc::vf2d vNewSize = (size - olc::vf2d(0.375f, 0.375f)).ceil(); + std::array points = { { {pos}, {pos.x, pos.y + vNewSize.y}, {pos + vNewSize}, {pos.x + vNewSize.x, pos.y} } }; + std::array uvs = { {{0,0},{0,0},{0,0},{0,0}} }; + std::array cols = { {col, col, col, col} }; + DrawExplicitDecal(nullptr, points.data(), uvs.data(), cols.data(), 4); + } + + void PixelGameEngine::GradientFillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR) + { + std::array points = { { {pos}, {pos.x, pos.y + size.y}, {pos + size}, {pos.x + size.x, pos.y} } }; + std::array uvs = { {{0,0},{0,0},{0,0},{0,0}} }; + std::array cols = { {colTL, colBL, colBR, colTR} }; + DrawExplicitDecal(nullptr, points.data(), uvs.data(), cols.data(), 4); + } + + void PixelGameEngine::DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& scale, const olc::Pixel& tint) + { + DecalInstance di; + di.decal = decal; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + di.w = { 1, 1, 1, 1 }; + di.tint = { tint, tint, tint, tint }; + di.points = 4; + di.pos[0] = (olc::vf2d(0.0f, 0.0f) - center) * scale; + di.pos[1] = (olc::vf2d(0.0f, float(decal->sprite->height)) - center) * scale; + di.pos[2] = (olc::vf2d(float(decal->sprite->width), float(decal->sprite->height)) - center) * scale; + di.pos[3] = (olc::vf2d(float(decal->sprite->width), 0.0f) - center) * scale; + float c = cos(fAngle), s = sin(fAngle); + for (int i = 0; i < 4; i++) + { + di.pos[i] = pos + olc::vf2d(di.pos[i].x * c - di.pos[i].y * s, di.pos[i].x * s + di.pos[i].y * c); + di.pos[i] = di.pos[i] * vInvScreenSize * 2.0f - olc::vf2d(1.0f, 1.0f); + di.pos[i].y *= -1.0f; + di.w[i] = 1; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + + void PixelGameEngine::DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) + { + DecalInstance di; + di.decal = decal; + di.points = 4; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.pos[0] = (olc::vf2d(0.0f, 0.0f) - center) * scale; + di.pos[1] = (olc::vf2d(0.0f, source_size.y) - center) * scale; + di.pos[2] = (olc::vf2d(source_size.x, source_size.y) - center) * scale; + di.pos[3] = (olc::vf2d(source_size.x, 0.0f) - center) * scale; + float c = cos(fAngle), s = sin(fAngle); + for (int i = 0; i < 4; i++) + { + di.pos[i] = pos + olc::vf2d(di.pos[i].x * c - di.pos[i].y * s, di.pos[i].x * s + di.pos[i].y * c); + di.pos[i] = di.pos[i] * vInvScreenSize * 2.0f - olc::vf2d(1.0f, 1.0f); + di.pos[i].y *= -1.0f; + } + + olc::vf2d uvtl = source_pos * decal->vUVScale; + olc::vf2d uvbr = uvtl + (source_size * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + olc::vf2d center; + float rd = ((pos[2].x - pos[0].x) * (pos[3].y - pos[1].y) - (pos[3].x - pos[1].x) * (pos[2].y - pos[0].y)); + if (rd != 0) + { + olc::vf2d uvtl = source_pos * decal->vUVScale; + olc::vf2d uvbr = uvtl + (source_size * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + + rd = 1.0f / rd; + float rn = ((pos[3].x - pos[1].x) * (pos[0].y - pos[1].y) - (pos[3].y - pos[1].y) * (pos[0].x - pos[1].x)) * rd; + float sn = ((pos[2].x - pos[0].x) * (pos[0].y - pos[1].y) - (pos[2].y - pos[0].y) * (pos[0].x - pos[1].x)) * rd; + if (!(rn < 0.f || rn > 1.f || sn < 0.f || sn > 1.f)) center = pos[0] + rn * (pos[2] - pos[0]); + float d[4]; for (int i = 0; i < 4; i++) d[i] = (pos[i] - center).mag(); + for (int i = 0; i < 4; i++) + { + float q = d[i] == 0.0f ? 1.0f : (d[i] + d[(i + 2) & 3]) / d[(i + 2) & 3]; + di.uv[i] *= q; di.w[i] *= q; + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint) + { + // Thanks Nathan Reed, a brilliant article explaining whats going on here + // http://www.reedbeta.com/blog/quadrilateral-interpolation-part-1/ + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + olc::vf2d center; + float rd = ((pos[2].x - pos[0].x) * (pos[3].y - pos[1].y) - (pos[3].x - pos[1].x) * (pos[2].y - pos[0].y)); + if (rd != 0) + { + rd = 1.0f / rd; + float rn = ((pos[3].x - pos[1].x) * (pos[0].y - pos[1].y) - (pos[3].y - pos[1].y) * (pos[0].x - pos[1].x)) * rd; + float sn = ((pos[2].x - pos[0].x) * (pos[0].y - pos[1].y) - (pos[2].y - pos[0].y) * (pos[0].x - pos[1].x)) * rd; + if (!(rn < 0.f || rn > 1.f || sn < 0.f || sn > 1.f)) center = pos[0] + rn * (pos[2] - pos[0]); + float d[4]; for (int i = 0; i < 4; i++) d[i] = (pos[i] - center).mag(); + for (int i = 0; i < 4; i++) + { + float q = d[i] == 0.0f ? 1.0f : (d[i] + d[(i + 2) & 3]) / d[(i + 2) & 3]; + di.uv[i] *= q; di.w[i] *= q; + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint) + { DrawWarpedDecal(decal, pos.data(), tint); } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint) + { DrawWarpedDecal(decal, &pos[0], tint); } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { DrawPartialWarpedDecal(decal, pos.data(), source_pos, source_size, tint); } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { DrawPartialWarpedDecal(decal, &pos[0], source_pos, source_size, tint); } + + void PixelGameEngine::DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos, fontRenderable.Decal(), {float(ox) * 8.0f, float(oy) * 8.0f}, {8.0f, 8.0f}, scale, col); + spos.x += 8.0f * scale.x; + } + } + } + + void PixelGameEngine::DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos, fontRenderable.Decal(), { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col); + spos.x += float(vFontSpacing[c - 32].y) * scale.x; + } + } + } + // Thanks Oso-Grande/Sopadeoso For these awesom and stupidly clever Text Rotation routines... duh XD + void PixelGameEngine::DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f, float(oy) * 8.0f }, { 8.0f, 8.0f }, scale, col); + spos.x -= 8.0f; + } + } + } + + void PixelGameEngine::DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col); + spos.x -= float(vFontSpacing[c - 32].y); + } + } + } + + olc::vi2d PixelGameEngine::GetTextSize(const std::string& s) + { + olc::vi2d size = { 0,1 }; + olc::vi2d pos = { 0,1 }; + for (auto c : s) + { + if (c == '\n') { pos.y++; pos.x = 0; } + else if (c == '\t') { pos.x += nTabSizeInSpaces; } + else pos.x++; + size.x = std::max(size.x, pos.x); + size.y = std::max(size.y, pos.y); + } + return size * 8; + } + + void PixelGameEngine::DrawString(const olc::vi2d& pos, const std::string& sText, Pixel col, uint32_t scale) + { DrawString(pos.x, pos.y, sText, col, scale); } + + void PixelGameEngine::DrawString(int32_t x, int32_t y, const std::string& sText, Pixel col, uint32_t scale) + { + int32_t sx = 0; + int32_t sy = 0; + Pixel::Mode m = nPixelMode; + // Thanks @tucna, spotted bug with col.ALPHA :P + if (m != Pixel::CUSTOM) // Thanks @Megarev, required for "shaders" + { + if (col.a != 255) SetPixelMode(Pixel::ALPHA); + else SetPixelMode(Pixel::MASK); + } + for (auto c : sText) + { + if (c == '\n') + { + sx = 0; sy += 8 * scale; + } + else if (c == '\t') + { + sx += 8 * nTabSizeInSpaces * scale; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + + if (scale > 1) + { + for (uint32_t i = 0; i < 8; i++) + for (uint32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + } + else + { + for (uint32_t i = 0; i < 8; i++) + for (uint32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) + Draw(x + sx + i, y + sy + j, col); + } + sx += 8 * scale; + } + } + SetPixelMode(m); + } + + olc::vi2d PixelGameEngine::GetTextSizeProp(const std::string& s) + { + olc::vi2d size = { 0,1 }; + olc::vi2d pos = { 0,1 }; + for (auto c : s) + { + if (c == '\n') { pos.y += 1; pos.x = 0; } + else if (c == '\t') { pos.x += nTabSizeInSpaces * 8; } + else pos.x += vFontSpacing[c - 32].y; + size.x = std::max(size.x, pos.x); + size.y = std::max(size.y, pos.y); + } + + size.y *= 8; + return size; + } + + void PixelGameEngine::DrawStringProp(const olc::vi2d& pos, const std::string& sText, Pixel col, uint32_t scale) + { DrawStringProp(pos.x, pos.y, sText, col, scale); } + + void PixelGameEngine::DrawStringProp(int32_t x, int32_t y, const std::string& sText, Pixel col, uint32_t scale) + { + int32_t sx = 0; + int32_t sy = 0; + Pixel::Mode m = nPixelMode; + + if (m != Pixel::CUSTOM) + { + if (col.a != 255) SetPixelMode(Pixel::ALPHA); + else SetPixelMode(Pixel::MASK); + } + for (auto c : sText) + { + if (c == '\n') + { + sx = 0; sy += 8 * scale; + } + else if (c == '\t') + { + sx += 8 * nTabSizeInSpaces * scale; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + + if (scale > 1) + { + for (int32_t i = 0; i < vFontSpacing[c - 32].y; i++) + for (int32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) + for (int32_t is = 0; is < int(scale); is++) + for (int32_t js = 0; js < int(scale); js++) + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + } + else + { + for (int32_t i = 0; i < vFontSpacing[c - 32].y; i++) + for (int32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) + Draw(x + sx + i, y + sy + j, col); + } + sx += vFontSpacing[c - 32].y * scale; + } + } + SetPixelMode(m); + } + + void PixelGameEngine::SetPixelMode(Pixel::Mode m) + { nPixelMode = m; } + + Pixel::Mode PixelGameEngine::GetPixelMode() + { return nPixelMode; } + + void PixelGameEngine::SetPixelMode(std::function pixelMode) + { + funcPixelMode = pixelMode; + nPixelMode = Pixel::Mode::CUSTOM; + } + + void PixelGameEngine::SetPixelBlend(float fBlend) + { + fBlendFactor = fBlend; + if (fBlendFactor < 0.0f) fBlendFactor = 0.0f; + if (fBlendFactor > 1.0f) fBlendFactor = 1.0f; + } + + std::stringstream& PixelGameEngine::ConsoleOut() + { return ssConsoleOutput; } + + bool PixelGameEngine::IsConsoleShowing() const + { return bConsoleShow; } + + void PixelGameEngine::ConsoleShow(const olc::Key& keyExit, bool bSuspendTime) + { + if (bConsoleShow) + return; + + bConsoleShow = true; + bConsoleSuspendTime = bSuspendTime; + TextEntryEnable(true); + keyConsoleExit = keyExit; + pKeyboardState[keyConsoleExit].bHeld = false; + pKeyboardState[keyConsoleExit].bPressed = false; + pKeyboardState[keyConsoleExit].bReleased = true; + } + + void PixelGameEngine::ConsoleClear() + { sConsoleLines.clear(); } + + void PixelGameEngine::ConsoleCaptureStdOut(const bool bCapture) + { + if(bCapture) + sbufOldCout = std::cout.rdbuf(ssConsoleOutput.rdbuf()); + else + std::cout.rdbuf(sbufOldCout); + } + + void PixelGameEngine::UpdateConsole() + { + if (GetKey(keyConsoleExit).bPressed) + { + TextEntryEnable(false); + bConsoleSuspendTime = false; + bConsoleShow = false; + return; + } + + // Keep Console sizes based in real screen dimensions + vConsoleCharacterScale = olc::vf2d(1.0f, 2.0f) / (olc::vf2d(vViewSize) * vInvScreenSize); + vConsoleSize = (vViewSize / olc::vi2d(8, 16)) - olc::vi2d(2, 4); + + // If console has changed size, simply reset it + if (vConsoleSize.y != sConsoleLines.size()) + { + vConsoleCursor = { 0,0 }; + sConsoleLines.clear(); + sConsoleLines.resize(vConsoleSize.y); + } + + auto TypeCharacter = [&](const char c) + { + if (c >= 32 && c < 127) + { + sConsoleLines[vConsoleCursor.y].append(1, c); + vConsoleCursor.x++; + } + + if( c == '\n' || vConsoleCursor.x >= vConsoleSize.x) + { + vConsoleCursor.y++; vConsoleCursor.x = 0; + } + + if (vConsoleCursor.y >= vConsoleSize.y) + { + vConsoleCursor.y = vConsoleSize.y - 1; + for (size_t i = 1; i < vConsoleSize.y; i++) + sConsoleLines[i - 1] = sConsoleLines[i]; + sConsoleLines[vConsoleCursor.y].clear(); + } + }; + + // Empty out "std::cout", parsing as we go + while (ssConsoleOutput.rdbuf()->sgetc() != -1) + { + char c = ssConsoleOutput.rdbuf()->sbumpc(); + TypeCharacter(c); + } + + // Draw Shadow + GradientFillRectDecal({ 0,0 }, olc::vf2d(vScreenSize), olc::PixelF(0, 0, 0.5f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f)); + + // Draw the console buffer + SetDecalMode(olc::DecalMode::NORMAL); + for (int32_t nLine = 0; nLine < vConsoleSize.y; nLine++) + DrawStringDecal(olc::vf2d( 1, 1 + float(nLine) ) * vConsoleCharacterScale * 8.0f, sConsoleLines[nLine], olc::WHITE, vConsoleCharacterScale); + + // Draw Input State + FillRectDecal(olc::vf2d(1 + float((TextEntryGetCursor() + 1)), 1 + float((vConsoleSize.y - 1))) * vConsoleCharacterScale * 8.0f, olc::vf2d(8, 8) * vConsoleCharacterScale, olc::DARK_CYAN); + DrawStringDecal(olc::vf2d(1, 1 + float((vConsoleSize.y - 1))) * vConsoleCharacterScale * 8.0f, std::string(">") + TextEntryGetString(), olc::YELLOW, vConsoleCharacterScale); + } + + + + void PixelGameEngine::TextEntryEnable(const bool bEnable, const std::string& sText) + { + if (bEnable) + { + nTextEntryCursor = int32_t(sText.size()); + sTextEntryString = sText; + bTextEntryEnable = true; + } + else + { + bTextEntryEnable = false; + } + } + + std::string PixelGameEngine::TextEntryGetString() const + { return sTextEntryString; } + + int32_t PixelGameEngine::TextEntryGetCursor() const + { return nTextEntryCursor; } + + bool PixelGameEngine::IsTextEntryEnabled() const + { return bTextEntryEnable; } + + void PixelGameEngine::SetFPSDisplay(bool display) + { showFPS=display; } + + + void PixelGameEngine::UpdateTextEntry() + { + // Check for typed characters + for (const auto& key : vKeyboardMap) + if (GetKey(std::get<0>(key)).bPressed) + { + sTextEntryString.insert(nTextEntryCursor, GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key)); + nTextEntryCursor++; + } + + // Check for command characters + if (GetKey(olc::Key::LEFT).bPressed) + nTextEntryCursor = std::max(0, nTextEntryCursor - 1); + if (GetKey(olc::Key::RIGHT).bPressed) + nTextEntryCursor = std::min(int32_t(sTextEntryString.size()), nTextEntryCursor + 1); + if (GetKey(olc::Key::BACK).bPressed && nTextEntryCursor > 0) + { + sTextEntryString.erase(nTextEntryCursor-1, 1); + nTextEntryCursor = std::max(0, nTextEntryCursor - 1); + } + if (GetKey(olc::Key::DEL).bPressed && nTextEntryCursor < sTextEntryString.size()) + sTextEntryString.erase(nTextEntryCursor, 1); + + if (GetKey(olc::Key::UP).bPressed) + { + if (!sCommandHistory.empty()) + { + if (sCommandHistoryIt != sCommandHistory.begin()) + sCommandHistoryIt--; + + nTextEntryCursor = int32_t(sCommandHistoryIt->size()); + sTextEntryString = *sCommandHistoryIt; + } + } + + if (GetKey(olc::Key::DOWN).bPressed) + { + if (!sCommandHistory.empty()) + { + if (sCommandHistoryIt != sCommandHistory.end()) + { + sCommandHistoryIt++; + if (sCommandHistoryIt != sCommandHistory.end()) + { + nTextEntryCursor = int32_t(sCommandHistoryIt->size()); + sTextEntryString = *sCommandHistoryIt; + } + else + { + nTextEntryCursor = 0; + sTextEntryString = ""; + } + } + } + } + + if (GetKey(olc::Key::ENTER).bPressed) + { + if (bConsoleShow) + { + std::cout << ">" + sTextEntryString + "\n"; + if (OnConsoleCommand(sTextEntryString)) + { + sCommandHistory.push_back(sTextEntryString); + sCommandHistoryIt = sCommandHistory.end(); + } + sTextEntryString.clear(); + nTextEntryCursor = 0; + } + else + { + OnTextEntryComplete(sTextEntryString); + TextEntryEnable(false); + } + } + } + + // User must override these functions as required. I have not made + // them abstract because I do need a default behaviour to occur if + // they are not overwritten + + bool PixelGameEngine::OnUserCreate() + { return false; } + + bool PixelGameEngine::OnUserUpdate(float fElapsedTime) + { UNUSED(fElapsedTime); return false; } + + bool PixelGameEngine::OnUserDestroy() + { return true; } + + void PixelGameEngine::GetAnyKey(){}; + void PixelGameEngine::GetAnyKeyPress(olc::Key pressedKey){}; + + void PixelGameEngine::OnTextEntryComplete(const std::string& sText) { UNUSED(sText); } + bool PixelGameEngine::OnConsoleCommand(const std::string& sCommand) { UNUSED(sCommand); return false; } + + + // Externalised API + void PixelGameEngine::olc_UpdateViewport() + { + int32_t ww = vScreenSize.x * vPixelSize.x; + int32_t wh = vScreenSize.y * vPixelSize.y; + float wasp = (float)ww / (float)wh; + + if (bPixelCohesion) + { + vScreenPixelSize = (vWindowSize / vScreenSize); + vViewSize = (vWindowSize / vScreenSize) * vScreenSize; + } + else + { + vViewSize.x = (int32_t)vWindowSize.x; + vViewSize.y = (int32_t)((float)vViewSize.x / wasp); + + if (vViewSize.y > vWindowSize.y) + { + vViewSize.y = vWindowSize.y; + vViewSize.x = (int32_t)((float)vViewSize.y * wasp); + } + } + + vViewPos = (vWindowSize - vViewSize) / 2; + } + + void PixelGameEngine::olc_UpdateWindowSize(int32_t x, int32_t y) + { + vWindowSize = { x, y }; + olc_UpdateViewport(); + } + + void PixelGameEngine::olc_UpdateMouseWheel(int32_t delta) + { nMouseWheelDeltaCache += delta; } + + void PixelGameEngine::olc_UpdateMouse(int32_t x, int32_t y) + { + // Mouse coords come in screen space + // But leave in pixel space + bHasMouseFocus = true; + vMouseWindowPos = { x, y }; + // Full Screen mode may have a weird viewport we must clamp to + x -= vViewPos.x; + y -= vViewPos.y; + vMousePosCache.x = (int32_t)(((float)x / (float)(vWindowSize.x - (vViewPos.x * 2)) * (float)vScreenSize.x)); + vMousePosCache.y = (int32_t)(((float)y / (float)(vWindowSize.y - (vViewPos.y * 2)) * (float)vScreenSize.y)); + if (vMousePosCache.x >= (int32_t)vScreenSize.x) vMousePosCache.x = vScreenSize.x - 1; + if (vMousePosCache.y >= (int32_t)vScreenSize.y) vMousePosCache.y = vScreenSize.y - 1; + if (vMousePosCache.x < 0) vMousePosCache.x = 0; + if (vMousePosCache.y < 0) vMousePosCache.y = 0; + } + + void PixelGameEngine::olc_UpdateMouseState(int32_t button, bool state) + { pMouseNewState[button] = state; } + + void PixelGameEngine::olc_UpdateKeyState(int32_t key, bool state) + { pKeyNewState[key] = state; } + + void PixelGameEngine::olc_UpdateMouseFocus(bool state) + { bHasMouseFocus = state; } + + void PixelGameEngine::olc_UpdateKeyFocus(bool state) + { bHasInputFocus = state; } + + void PixelGameEngine::olc_Reanimate() + { bAtomActive = true; } + + bool PixelGameEngine::olc_IsRunning() + { return bAtomActive; } + + void PixelGameEngine::olc_Terminate() + { bAtomActive = false; } + + void PixelGameEngine::EngineThread() + { + // Allow platform to do stuff here if needed, since its now in the + // context of this thread + if (platform->ThreadStartUp() == olc::FAIL) return; + + // Do engine context specific initialisation + olc_PrepareEngine(); + + // Create user resources as part of this thread + for (auto& ext : vExtensions) ext->OnBeforeUserCreate(); + if (!OnUserCreate()) bAtomActive = false; + for (auto& ext : vExtensions) ext->OnAfterUserCreate(); + + while (bAtomActive) + { + // Run as fast as possible + while (bAtomActive) { olc_CoreUpdate(); } + + // Allow the user to free resources if they have overrided the destroy function + if (!OnUserDestroy()) + { + // User denied destroy for some reason, so continue running + bAtomActive = true; + } + } + + platform->ThreadCleanUp(); + } + + void PixelGameEngine::olc_PrepareEngine() + { + // Start OpenGL, the context is owned by the game thread + if (platform->CreateGraphics(bFullScreen, bEnableVSYNC, vViewPos, vViewSize) == olc::FAIL) return; + + // Construct default font sheet + olc_ConstructFontSheet(); + + // Create Primary Layer "0" + CreateLayer(); + vLayers[0].bUpdate = true; + vLayers[0].bShow = true; + SetDrawTarget(nullptr); + + m_tp1 = std::chrono::system_clock::now(); + m_tp2 = std::chrono::system_clock::now(); + } + + + void PixelGameEngine::olc_CoreUpdate() + { + // Handle Timing + m_tp2 = std::chrono::system_clock::now(); + std::chrono::duration elapsedTime = m_tp2 - m_tp1; + m_tp1 = m_tp2; + + // Our time per frame coefficient + float fElapsedTime = elapsedTime.count(); + fLastElapsed = fElapsedTime; + + if (bConsoleSuspendTime) + fElapsedTime = 0.0f; + + // Some platforms will need to check for events + platform->HandleSystemEvent(); + + // Compare hardware input states from previous frame + auto ScanHardware = [&](HWButton* pKeys, bool* pStateOld, bool* pStateNew, uint32_t nKeyCount,bool keyboard=true) + { + bool pressed=false; + int key; + for (uint32_t i = 0; i < nKeyCount; i++) + { + pKeys[i].bPressed = false; + pKeys[i].bReleased = false; + if (pStateNew[i] != pStateOld[i]) + { + if (pStateNew[i]) + { + pressed=true; + key=i; + pKeys[i].bPressed = !pKeys[i].bHeld; + pKeys[i].bHeld = true; + } + else + { + pKeys[i].bReleased = true; + pKeys[i].bHeld = false; + } + GetAnyKey(); + } + pStateOld[i] = pStateNew[i]; + } + if (pressed) { + if (keyboard) {GetAnyKeyPress((olc::Key)key);} + else {GetAnyKeyPress(olc::Key::NONE);}} + }; + + ScanHardware(pKeyboardState, pKeyOldState, pKeyNewState, 256); + ScanHardware(pMouseState, pMouseOldState, pMouseNewState, nMouseButtons,false); + + // Cache mouse coordinates so they remain consistent during frame + vMousePos = vMousePosCache; + nMouseWheelDelta = nMouseWheelDeltaCache; + nMouseWheelDeltaCache = 0; + + if (bTextEntryEnable) + { + UpdateTextEntry(); + } + + // Handle Frame Update + bool bExtensionBlockFrame = false; + for (auto& ext : vExtensions) bExtensionBlockFrame |= ext->OnBeforeUserUpdate(fElapsedTime); + if (!bExtensionBlockFrame) + { + if (!OnUserUpdate(fElapsedTime)) bAtomActive = false; + } + for (auto& ext : vExtensions) ext->OnAfterUserUpdate(fElapsedTime); + + if (bConsoleShow) + { + SetDrawTarget((uint8_t)0); + UpdateConsole(); + } + + // Display Frame + renderer->UpdateViewport(vViewPos, vViewSize); + renderer->ClearBuffer(olc::BLACK, true); + + // Layer 0 must always exist + vLayers[0].bUpdate = true; + vLayers[0].bShow = true; + SetDecalMode(DecalMode::NORMAL); + renderer->PrepareDrawing(); + + for (auto layer = vLayers.rbegin(); layer != vLayers.rend(); ++layer) + { + if (layer->bShow) + { + if (layer->funcHook == nullptr) + { + renderer->ApplyTexture(layer->pDrawTarget.Decal()->id); + if (!bSuspendTextureTransfer && layer->bUpdate) + { + layer->pDrawTarget.Decal()->Update(); + layer->bUpdate = false; + } + + renderer->DrawLayerQuad(layer->vOffset, layer->vScale, layer->tint); + + // Display Decals in order for this layer + for (auto& decal : layer->vecDecalInstance) + renderer->DrawDecal(decal); + layer->vecDecalInstance.clear(); + } + else + { + // Mwa ha ha.... Have Fun!!! + layer->funcHook(); + } + } + } + + + + // Present Graphics to screen + renderer->DisplayFrame(); + + if (showFPS) { + // Update Title Bar + fFrameTimer += fElapsedTime; + nFrameCount++; + if (fFrameTimer >= 1.0f) + { + nLastFPS = nFrameCount; + fFrameTimer -= 1.0f; + std::string sTitle = "OneLoneCoder.com - Pixel Game Engine - " + sAppName + " - FPS: " + std::to_string(nFrameCount); + platform->SetWindowTitle(sTitle); + nFrameCount = 0; + } + } else { + std::string sTitle = "OneLoneCoder.com - Pixel Game Engine - " + sAppName; + platform->SetWindowTitle(sTitle); + } + } + + void PixelGameEngine::olc_ConstructFontSheet() + { + std::string data; + data += "?Q`0001oOch0o01o@F40o000000000"; + data += "O000000nOT0063Qo4d8>?7a14Gno94AA4gno94AaOT0>o3`oO400o7QN00000400"; + data += "Of80001oOg<7O7moBGT7O7lABET024@aBEd714AiOdl717a_=TH013Q>00000000"; + data += "720D000V?V5oB3Q_HdUoE7a9@DdDE4A9@DmoE4A;Hg]oM4Aj8S4D84@`00000000"; + data += "OaPT1000Oa`^13P1@AI[?g`1@A=[OdAoHgljA4Ao?WlBA7l1710007l100000000"; + data += "ObM6000oOfMV?3QoBDD`O7a0BDDH@5A0BDD<@5A0BGeVO5ao@CQR?5Po00000000"; + data += "Oc``000?Ogij70PO2D]??0Ph2DUM@7i`2DTg@7lh2GUj?0TO0C1870T?00000000"; + data += "70<4001o?P<7?1QoHg43O;`h@GT0@:@LB@d0>:@hN@L0@?aoN@<0O7ao0000?000"; + data += "OcH0001SOglLA7mg24TnK7ln24US>0PL24U140PnOgl0>7QgOcH0K71S0000A000"; + data += "00H00000@Dm1S007@DUSg00?OdTnH7YhOfTL<7Yh@Cl0700?@Ah0300700000000"; + data += "<008001QL00ZA41a@6HnI<1i@FHLM81M@@0LG81?O`0nC?Y7?`0ZA7Y300080000"; + data += "O`082000Oh0827mo6>Hn?Wmo?6HnMb11MP08@C11H`08@FP0@@0004@000000000"; + data += "00P00001Oab00003OcKP0006@6=PMgl<@440MglH@000000`@000001P00000000"; + data += "Ob@8@@00Ob@8@Ga13R@8Mga172@8?PAo3R@827QoOb@820@0O`0007`0000007P0"; + data += "O`000P08Od400g`<3V=P0G`673IP0`@3>1`00P@6O`P00g`SetPixel(px, py, olc::Pixel(k, k, k, k)); + if (++py == 48) { px++; py = 0; } + } + } + + fontRenderable.Decal()->Update(); + + constexpr std::array vSpacing = { { + 0x03,0x25,0x16,0x08,0x07,0x08,0x08,0x04,0x15,0x15,0x08,0x07,0x15,0x07,0x24,0x08, + 0x08,0x17,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x24,0x15,0x06,0x07,0x16,0x17, + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x17,0x08,0x08,0x08, + 0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x08,0x08,0x17,0x08,0x15,0x08,0x15,0x08,0x08, + 0x24,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x33,0x17,0x17,0x33,0x18,0x17,0x17, + 0x17,0x17,0x17,0x17,0x07,0x17,0x17,0x18,0x18,0x17,0x17,0x07,0x33,0x07,0x08,0x00, } }; + + for (auto c : vSpacing) vFontSpacing.push_back({ c >> 4, c & 15 }); + + // UK Standard Layout +#ifdef OLC_KEYBOARD_UK + vKeyboardMap = + { + {olc::Key::A, "a", "A"}, {olc::Key::B, "b", "B"}, {olc::Key::C, "c", "C"}, {olc::Key::D, "d", "D"}, {olc::Key::E, "e", "E"}, + {olc::Key::F, "f", "F"}, {olc::Key::G, "g", "G"}, {olc::Key::H, "h", "H"}, {olc::Key::I, "i", "I"}, {olc::Key::J, "j", "J"}, + {olc::Key::K, "k", "K"}, {olc::Key::L, "l", "L"}, {olc::Key::M, "m", "M"}, {olc::Key::N, "n", "N"}, {olc::Key::O, "o", "O"}, + {olc::Key::P, "p", "P"}, {olc::Key::Q, "q", "Q"}, {olc::Key::R, "r", "R"}, {olc::Key::S, "s", "S"}, {olc::Key::T, "t", "T"}, + {olc::Key::U, "u", "U"}, {olc::Key::V, "v", "V"}, {olc::Key::W, "w", "W"}, {olc::Key::X, "x", "X"}, {olc::Key::Y, "y", "Y"}, + {olc::Key::Z, "z", "Z"}, + + {olc::Key::K0, "0", ")"}, {olc::Key::K1, "1", "!"}, {olc::Key::K2, "2", "\""}, {olc::Key::K3, "3", "#"}, {olc::Key::K4, "4", "$"}, + {olc::Key::K5, "5", "%"}, {olc::Key::K6, "6", "^"}, {olc::Key::K7, "7", "&"}, {olc::Key::K8, "8", "*"}, {olc::Key::K9, "9", "("}, + + {olc::Key::NP0, "0", "0"}, {olc::Key::NP1, "1", "1"}, {olc::Key::NP2, "2", "2"}, {olc::Key::NP3, "3", "3"}, {olc::Key::NP4, "4", "4"}, + {olc::Key::NP5, "5", "5"}, {olc::Key::NP6, "6", "6"}, {olc::Key::NP7, "7", "7"}, {olc::Key::NP8, "8", "8"}, {olc::Key::NP9, "9", "9"}, + {olc::Key::NP_MUL, "*", "*"}, {olc::Key::NP_DIV, "/", "/"}, {olc::Key::NP_ADD, "+", "+"}, {olc::Key::NP_SUB, "-", "-"}, {olc::Key::NP_DECIMAL, ".", "."}, + + {olc::Key::PERIOD, ".", ">"}, {olc::Key::EQUALS, "=", "+"}, {olc::Key::COMMA, ",", "<"}, {olc::Key::MINUS, "-", "_"}, {olc::Key::SPACE, " ", " "}, + + {olc::Key::OEM_1, ";", ":"}, {olc::Key::OEM_2, "/", "?"}, {olc::Key::OEM_3, "\'", "@"}, {olc::Key::OEM_4, "[", "{"}, + {olc::Key::OEM_5, "\\", "|"}, {olc::Key::OEM_6, "]", "}"}, {olc::Key::OEM_7, "#", "~"}, + + // {olc::Key::TAB, "\t", "\t"} + }; +#endif + } + + void PixelGameEngine::pgex_Register(olc::PGEX* pgex) + { + if (std::find(vExtensions.begin(), vExtensions.end(), pgex) == vExtensions.end()) + vExtensions.push_back(pgex); + } + + + PGEX::PGEX(bool bHook) { if(bHook) pge->pgex_Register(this); } + void PGEX::OnBeforeUserCreate() {} + void PGEX::OnAfterUserCreate() {} + bool PGEX::OnBeforeUserUpdate(float& fElapsedTime) { return false; } + void PGEX::OnAfterUserUpdate(float fElapsedTime) {} + + // Need a couple of statics as these are singleton instances + // read from multiple locations + std::atomic PixelGameEngine::bAtomActive{ false }; + olc::PixelGameEngine* olc::PGEX::pge = nullptr; + olc::PixelGameEngine* olc::Platform::ptrPGE = nullptr; + olc::PixelGameEngine* olc::Renderer::ptrPGE = nullptr; + std::unique_ptr olc::Sprite::loader = nullptr; +}; +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Renderers - the draw-y bits | +// O------------------------------------------------------------------------------O + +#if !defined(OLC_PGE_HEADLESS) + +#pragma region renderer_ogl10 +// O------------------------------------------------------------------------------O +// | START RENDERER: OpenGL 1.0 (the original, the best...) | +// O------------------------------------------------------------------------------O +#if defined(OLC_GFX_OPENGL10) + +#if defined(OLC_PLATFORM_WINAPI) + #include + #include + #if !defined(__MINGW32__) + #pragma comment(lib, "Dwmapi.lib") + #endif + typedef BOOL(WINAPI wglSwapInterval_t) (int interval); + static wglSwapInterval_t* wglSwapInterval = nullptr; + typedef HDC glDeviceContext_t; + typedef HGLRC glRenderContext_t; +#endif + +#if defined(__linux__) || defined(__FreeBSD__) + #include +#endif + +#if defined(OLC_PLATFORM_X11) + namespace X11 + { + #include + } + typedef int(glSwapInterval_t)(X11::Display* dpy, X11::GLXDrawable drawable, int interval); + static glSwapInterval_t* glSwapIntervalEXT; + typedef X11::GLXContext glDeviceContext_t; + typedef X11::GLXContext glRenderContext_t; +#endif + +#if defined(__APPLE__) + #define GL_SILENCE_DEPRECATION + #include + #include + #include +#endif + +namespace olc +{ + class Renderer_OGL10 : public olc::Renderer + { + private: +#if defined(OLC_PLATFORM_GLUT) + bool mFullScreen = false; +#else + glDeviceContext_t glDeviceContext = 0; + glRenderContext_t glRenderContext = 0; +#endif + + bool bSync = false; + olc::DecalMode nDecalMode = olc::DecalMode(-1); // Thanks Gusgo & Bispoo + olc::DecalStructure nDecalStructure = olc::DecalStructure(-1); +#if defined(OLC_PLATFORM_X11) + X11::Display* olc_Display = nullptr; + X11::Window* olc_Window = nullptr; + X11::XVisualInfo* olc_VisualInfo = nullptr; +#endif + + public: + void PrepareDevice() override + { +#if defined(OLC_PLATFORM_GLUT) + //glutInit has to be called with main() arguments, make fake ones + int argc = 0; + char* argv[1] = { (char*)"" }; + glutInit(&argc, argv); + glutInitWindowPosition(0, 0); + glutInitWindowSize(512, 512); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); + // Creates the window and the OpenGL context for it + glutCreateWindow("OneLoneCoder.com - Pixel Game Engine"); + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + } + + olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) override + { +#if defined(OLC_PLATFORM_WINAPI) + // Create Device Context + glDeviceContext = GetDC((HWND)(params[0])); + PIXELFORMATDESCRIPTOR pfd = + { + sizeof(PIXELFORMATDESCRIPTOR), 1, + PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PFD_MAIN_PLANE, 0, 0, 0, 0 + }; + + int pf = 0; + if (!(pf = ChoosePixelFormat(glDeviceContext, &pfd))) return olc::FAIL; + SetPixelFormat(glDeviceContext, pf, &pfd); + + if (!(glRenderContext = wglCreateContext(glDeviceContext))) return olc::FAIL; + wglMakeCurrent(glDeviceContext, glRenderContext); + + // Remove Frame cap + wglSwapInterval = (wglSwapInterval_t*)wglGetProcAddress("wglSwapIntervalEXT"); + if (wglSwapInterval && !bVSYNC) wglSwapInterval(0); + bSync = bVSYNC; +#endif + +#if defined(OLC_PLATFORM_X11) + using namespace X11; + // Linux has tighter coupling between OpenGL and X11, so we store + // various "platform" handles in the renderer + olc_Display = (X11::Display*)(params[0]); + olc_Window = (X11::Window*)(params[1]); + olc_VisualInfo = (X11::XVisualInfo*)(params[2]); + + glDeviceContext = glXCreateContext(olc_Display, olc_VisualInfo, nullptr, GL_TRUE); + glXMakeCurrent(olc_Display, *olc_Window, glDeviceContext); + + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, *olc_Window, &gwa); + glViewport(0, 0, gwa.width, gwa.height); + + glSwapIntervalEXT = nullptr; + glSwapIntervalEXT = (glSwapInterval_t*)glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"); + + if (glSwapIntervalEXT == nullptr && !bVSYNC) + { + printf("NOTE: Could not disable VSYNC, glXSwapIntervalEXT() was not found!\n"); + printf(" Don't worry though, things will still work, it's just the\n"); + printf(" frame rate will be capped to your monitors refresh rate - javidx9\n"); + } + + if (glSwapIntervalEXT != nullptr && !bVSYNC) + glSwapIntervalEXT(olc_Display, *olc_Window, 0); +#endif + +#if defined(OLC_PLATFORM_GLUT) + mFullScreen = bFullScreen; + if (!bVSYNC) + { +#if defined(__APPLE__) + GLint sync = 0; + CGLContextObj ctx = CGLGetCurrentContext(); + if (ctx) CGLSetParameter(ctx, kCGLCPSwapInterval, &sync); +#endif + } +#else + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + return olc::rcode::OK; + } + + olc::rcode DestroyDevice() override + { +#if defined(OLC_PLATFORM_WINAPI) + wglDeleteContext(glRenderContext); +#endif + +#if defined(OLC_PLATFORM_X11) + glXMakeCurrent(olc_Display, None, NULL); + glXDestroyContext(olc_Display, glDeviceContext); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutDestroyWindow(glutGetWindow()); +#endif + return olc::rcode::OK; + } + + void DisplayFrame() override + { +#if defined(OLC_PLATFORM_WINAPI) + SwapBuffers(glDeviceContext); + if (bSync) DwmFlush(); // Woooohooooooo!!!! SMOOOOOOOTH! +#endif + +#if defined(OLC_PLATFORM_X11) + X11::glXSwapBuffers(olc_Display, *olc_Window); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutSwapBuffers(); +#endif + } + + void PrepareDrawing() override + { + + //ClearBuffer(olc::GREEN, true); + glEnable(GL_BLEND); + nDecalMode = DecalMode::NORMAL; + nDecalStructure = DecalStructure::FAN; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + void SetDecalMode(const olc::DecalMode& mode) + { + if (mode != nDecalMode) + { + switch (mode) + { + case olc::DecalMode::NORMAL: + case olc::DecalMode::MODEL3D: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + case olc::DecalMode::ADDITIVE: + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + break; + case olc::DecalMode::MULTIPLICATIVE: + glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); + break; + case olc::DecalMode::STENCIL: + glBlendFunc(GL_ZERO, GL_SRC_ALPHA); + break; + case olc::DecalMode::ILLUMINATE: + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); + break; + case olc::DecalMode::WIREFRAME: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + } + + nDecalMode = mode; + } + } + + void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) override + { + glBegin(GL_QUADS); + glColor4ub(tint.r, tint.g, tint.b, tint.a); + glTexCoord2f(0.0f * scale.x + offset.x, 1.0f * scale.y + offset.y); + glVertex3f(-1.0f /*+ vSubPixelOffset.x*/, -1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(0.0f * scale.x + offset.x, 0.0f * scale.y + offset.y); + glVertex3f(-1.0f /*+ vSubPixelOffset.x*/, 1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(1.0f * scale.x + offset.x, 0.0f * scale.y + offset.y); + glVertex3f(1.0f /*+ vSubPixelOffset.x*/, 1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(1.0f * scale.x + offset.x, 1.0f * scale.y + offset.y); + glVertex3f(1.0f /*+ vSubPixelOffset.x*/, -1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glEnd(); + } + + void DrawDecal(const olc::DecalInstance& decal) override + { + SetDecalMode(decal.mode); + + if (decal.decal == nullptr) + glBindTexture(GL_TEXTURE_2D, 0); + else + glBindTexture(GL_TEXTURE_2D, decal.decal->id); + + if (nDecalMode == DecalMode::MODEL3D) + { +#ifdef OLC_ENABLE_EXPERIMENTAL + glMatrixMode(GL_PROJECTION); glPushMatrix(); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); + + glEnable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1, 1000); + + #pragma comment (lib, "winmm.lib") + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, -40, -200); + glRotatef(float(clock()) * 0.1f, 1, 0, 0); + glRotatef(float(clock()) * 0.1f * 2, 0, 1, 0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glBegin(GL_TRIANGLES); + + + // Render as 3D Spatial Entity + for (uint32_t n = 0; n < decal.points; n++) + { + glColor4ub(decal.tint[n].r, decal.tint[n].g, decal.tint[n].b, decal.tint[n].a); + glTexCoord2f(decal.uv[n].x, decal.uv[n].y); + glVertex3f(decal.pos[n].x, decal.pos[n].y, decal.w[n]); + } + + glEnd(); + + glMatrixMode(GL_PROJECTION); glPopMatrix(); + glMatrixMode(GL_MODELVIEW); glPopMatrix(); + glDisable(GL_DEPTH_TEST); +#endif + } + else + { + if (nDecalMode == DecalMode::WIREFRAME) + glBegin(GL_LINE_LOOP); + else + { + if(decal.structure == olc::DecalStructure::FAN) + glBegin(GL_TRIANGLE_FAN); + else if(decal.structure == olc::DecalStructure::STRIP) + glBegin(GL_TRIANGLE_STRIP); + else if(decal.structure == olc::DecalStructure::LIST) + glBegin(GL_TRIANGLES); + } + + // Render as 2D Spatial entity + for (uint32_t n = 0; n < decal.points; n++) + { + glColor4ub(decal.tint[n].r, decal.tint[n].g, decal.tint[n].b, decal.tint[n].a); + glTexCoord4f(decal.uv[n].x, decal.uv[n].y, 0.0f, decal.w[n]); + glVertex2f(decal.pos[n].x, decal.pos[n].y); + } + + glEnd(); + } + + + //glDisable(GL_DEPTH_TEST); + } + + uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered, const bool clamp) override + { + UNUSED(width); + UNUSED(height); + uint32_t id = 0; + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + if (filtered) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + + if (clamp) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + return id; + } + + uint32_t DeleteTexture(const uint32_t id) override + { + glDeleteTextures(1, &id); + return id; + } + + void UpdateTexture(uint32_t id, olc::Sprite* spr) override + { + UNUSED(id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, spr->width, spr->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ReadTexture(uint32_t id, olc::Sprite* spr) override + { + glReadPixels(0, 0, spr->width, spr->height, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ApplyTexture(uint32_t id) override + { + glBindTexture(GL_TEXTURE_2D, id); + } + + void ClearBuffer(olc::Pixel p, bool bDepth) override + { + glClearColor(float(p.r) / 255.0f, float(p.g) / 255.0f, float(p.b) / 255.0f, float(p.a) / 255.0f); + glClear(GL_COLOR_BUFFER_BIT); + if (bDepth) glClear(GL_DEPTH_BUFFER_BIT); + } + + void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) override + { + glViewport(pos.x, pos.y, size.x, size.y); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END RENDERER: OpenGL 1.0 (the original, the best...) | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region renderer_ogl33 +// O------------------------------------------------------------------------------O +// | START RENDERER: OpenGL 3.3 (3.0 es) (sh-sh-sh-shaders....) | +// O------------------------------------------------------------------------------O +#if defined(OLC_GFX_OPENGL33) + +#if defined(OLC_PLATFORM_WINAPI) + #include + #include + #if !defined(__MINGW32__) + #pragma comment(lib, "Dwmapi.lib") + #endif + typedef void __stdcall locSwapInterval_t(GLsizei n); + typedef HDC glDeviceContext_t; + typedef HGLRC glRenderContext_t; + #define CALLSTYLE __stdcall + #define OGL_LOAD(t, n) (t*)wglGetProcAddress(#n) +#endif + +#if defined(__linux__) || defined(__FreeBSD__) + #include +#endif + +#if defined(OLC_PLATFORM_X11) + namespace X11 + { + #include + } + typedef int(locSwapInterval_t)(X11::Display* dpy, X11::GLXDrawable drawable, int interval); + typedef X11::GLXContext glDeviceContext_t; + typedef X11::GLXContext glRenderContext_t; + #define CALLSTYLE + #define OGL_LOAD(t, n) (t*)glXGetProcAddress((unsigned char*)#n); +#endif + +#if defined(__APPLE__) + #define GL_SILENCE_DEPRECATION + #include + #include + #include +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + #include + #include + #define GL_GLEXT_PROTOTYPES + #include + #include + #define CALLSTYLE + typedef EGLBoolean(locSwapInterval_t)(EGLDisplay display, EGLint interval); + #define GL_CLAMP GL_CLAMP_TO_EDGE + #define OGL_LOAD(t, n) n; +#endif + +namespace olc +{ + typedef char GLchar; + typedef ptrdiff_t GLsizeiptr; + typedef GLuint CALLSTYLE locCreateShader_t(GLenum type); + typedef GLuint CALLSTYLE locCreateProgram_t(void); + typedef void CALLSTYLE locDeleteShader_t(GLuint shader); +#if defined(OLC_PLATFORM_EMSCRIPTEN) + typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); +#else + typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar** string, const GLint* length); +#endif + typedef void CALLSTYLE locCompileShader_t(GLuint shader); + typedef void CALLSTYLE locLinkProgram_t(GLuint program); + typedef void CALLSTYLE locDeleteProgram_t(GLuint program); + typedef void CALLSTYLE locAttachShader_t(GLuint program, GLuint shader); + typedef void CALLSTYLE locBindBuffer_t(GLenum target, GLuint buffer); + typedef void CALLSTYLE locBufferData_t(GLenum target, GLsizeiptr size, const void* data, GLenum usage); + typedef void CALLSTYLE locGenBuffers_t(GLsizei n, GLuint* buffers); + typedef void CALLSTYLE locVertexAttribPointer_t(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + typedef void CALLSTYLE locEnableVertexAttribArray_t(GLuint index); + typedef void CALLSTYLE locUseProgram_t(GLuint program); + typedef void CALLSTYLE locBindVertexArray_t(GLuint array); + typedef void CALLSTYLE locGenVertexArrays_t(GLsizei n, GLuint* arrays); + typedef void CALLSTYLE locGetShaderInfoLog_t(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); + + constexpr size_t OLC_MAX_VERTS = 128; + + class Renderer_OGL33 : public olc::Renderer + { + private: +#if defined(OLC_PLATFORM_EMSCRIPTEN) + EGLDisplay olc_Display; + EGLConfig olc_Config; + EGLContext olc_Context; + EGLSurface olc_Surface; +#endif + +#if defined(OLC_PLATFORM_GLUT) + bool mFullScreen = false; +#else + #if !defined(OLC_PLATFORM_EMSCRIPTEN) + glDeviceContext_t glDeviceContext = 0; + glRenderContext_t glRenderContext = 0; + #endif +#endif + bool bSync = false; + olc::DecalMode nDecalMode = olc::DecalMode(-1); // Thanks Gusgo & Bispoo +#if defined(OLC_PLATFORM_X11) + X11::Display* olc_Display = nullptr; + X11::Window* olc_Window = nullptr; + X11::XVisualInfo* olc_VisualInfo = nullptr; +#endif + + private: + locCreateShader_t* locCreateShader = nullptr; + locShaderSource_t* locShaderSource = nullptr; + locCompileShader_t* locCompileShader = nullptr; + locDeleteShader_t* locDeleteShader = nullptr; + locCreateProgram_t* locCreateProgram = nullptr; + locDeleteProgram_t* locDeleteProgram = nullptr; + locLinkProgram_t* locLinkProgram = nullptr; + locAttachShader_t* locAttachShader = nullptr; + locBindBuffer_t* locBindBuffer = nullptr; + locBufferData_t* locBufferData = nullptr; + locGenBuffers_t* locGenBuffers = nullptr; + locVertexAttribPointer_t* locVertexAttribPointer = nullptr; + locEnableVertexAttribArray_t* locEnableVertexAttribArray = nullptr; + locUseProgram_t* locUseProgram = nullptr; + locBindVertexArray_t* locBindVertexArray = nullptr; + locGenVertexArrays_t* locGenVertexArrays = nullptr; + locSwapInterval_t* locSwapInterval = nullptr; + locGetShaderInfoLog_t* locGetShaderInfoLog = nullptr; + + uint32_t m_nFS = 0; + uint32_t m_nVS = 0; + uint32_t m_nQuadShader = 0; + uint32_t m_vbQuad = 0; + uint32_t m_vaQuad = 0; + + struct locVertex + { + float pos[3]; + olc::vf2d tex; + olc::Pixel col; + }; + + locVertex pVertexMem[OLC_MAX_VERTS]; + + olc::Renderable rendBlankQuad; + + public: + void PrepareDevice() override + { +#if defined(OLC_PLATFORM_GLUT) + //glutInit has to be called with main() arguments, make fake ones + int argc = 0; + char* argv[1] = { (char*)"" }; + glutInit(&argc, argv); + glutInitWindowPosition(0, 0); + glutInitWindowSize(512, 512); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); + // Creates the window and the OpenGL context for it + glutCreateWindow("OneLoneCoder.com - Pixel Game Engine"); + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + } + + olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) override + { + // Create OpenGL Context +#if defined(OLC_PLATFORM_WINAPI) + // Create Device Context + glDeviceContext = GetDC((HWND)(params[0])); + PIXELFORMATDESCRIPTOR pfd = + { + sizeof(PIXELFORMATDESCRIPTOR), 1, + PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PFD_MAIN_PLANE, 0, 0, 0, 0 + }; + + int pf = 0; + if (!(pf = ChoosePixelFormat(glDeviceContext, &pfd))) return olc::FAIL; + SetPixelFormat(glDeviceContext, pf, &pfd); + + if (!(glRenderContext = wglCreateContext(glDeviceContext))) return olc::FAIL; + wglMakeCurrent(glDeviceContext, glRenderContext); + + // Set Vertical Sync + locSwapInterval = OGL_LOAD(locSwapInterval_t, "wglSwapIntervalEXT"); + if (locSwapInterval && !bVSYNC) locSwapInterval(0); + bSync = bVSYNC; +#endif + +#if defined(OLC_PLATFORM_X11) + using namespace X11; + // Linux has tighter coupling between OpenGL and X11, so we store + // various "platform" handles in the renderer + olc_Display = (X11::Display*)(params[0]); + olc_Window = (X11::Window*)(params[1]); + olc_VisualInfo = (X11::XVisualInfo*)(params[2]); + + glDeviceContext = glXCreateContext(olc_Display, olc_VisualInfo, nullptr, GL_TRUE); + glXMakeCurrent(olc_Display, *olc_Window, glDeviceContext); + + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, *olc_Window, &gwa); + glViewport(0, 0, gwa.width, gwa.height); + + locSwapInterval = OGL_LOAD(locSwapInterval_t, "glXSwapIntervalEXT"); + + if (locSwapInterval == nullptr && !bVSYNC) + { + printf("NOTE: Could not disable VSYNC, glXSwapIntervalEXT() was not found!\n"); + printf(" Don't worry though, things will still work, it's just the\n"); + printf(" frame rate will be capped to your monitors refresh rate - javidx9\n"); + } + + if (locSwapInterval != nullptr && !bVSYNC) + locSwapInterval(olc_Display, *olc_Window, 0); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + EGLint const attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_NONE }; + EGLint const context_config[] = { EGL_CONTEXT_CLIENT_VERSION , 2, EGL_NONE }; + EGLint num_config; + + olc_Display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + eglInitialize(olc_Display, nullptr, nullptr); + eglChooseConfig(olc_Display, attribute_list, &olc_Config, 1, &num_config); + + /* create an EGL rendering context */ + olc_Context = eglCreateContext(olc_Display, olc_Config, EGL_NO_CONTEXT, context_config); + olc_Surface = eglCreateWindowSurface(olc_Display, olc_Config, NULL, nullptr); + eglMakeCurrent(olc_Display, olc_Surface, olc_Surface, olc_Context); + //eglSwapInterval is currently a NOP, plement anyways in case it becomes supported + locSwapInterval = &eglSwapInterval; + locSwapInterval(olc_Display, bVSYNC ? 1 : 0); +#endif + +#if defined(OLC_PLATFORM_GLUT) + mFullScreen = bFullScreen; + if (!bVSYNC) + { +#if defined(__APPLE__) + GLint sync = 0; + CGLContextObj ctx = CGLGetCurrentContext(); + if (ctx) CGLSetParameter(ctx, kCGLCPSwapInterval, &sync); +#endif + } +#else + #if !defined(OLC_PLATFORM_EMSCRIPTEN) + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + #endif +#endif + // Load External OpenGL Functions + locCreateShader = OGL_LOAD(locCreateShader_t, glCreateShader); + locCompileShader = OGL_LOAD(locCompileShader_t, glCompileShader); + locShaderSource = OGL_LOAD(locShaderSource_t, glShaderSource); + locDeleteShader = OGL_LOAD(locDeleteShader_t, glDeleteShader); + locCreateProgram = OGL_LOAD(locCreateProgram_t, glCreateProgram); + locDeleteProgram = OGL_LOAD(locDeleteProgram_t, glDeleteProgram); + locLinkProgram = OGL_LOAD(locLinkProgram_t, glLinkProgram); + locAttachShader = OGL_LOAD(locAttachShader_t, glAttachShader); + locBindBuffer = OGL_LOAD(locBindBuffer_t, glBindBuffer); + locBufferData = OGL_LOAD(locBufferData_t, glBufferData); + locGenBuffers = OGL_LOAD(locGenBuffers_t, glGenBuffers); + locVertexAttribPointer = OGL_LOAD(locVertexAttribPointer_t, glVertexAttribPointer); + locEnableVertexAttribArray = OGL_LOAD(locEnableVertexAttribArray_t, glEnableVertexAttribArray); + locUseProgram = OGL_LOAD(locUseProgram_t, glUseProgram); + locGetShaderInfoLog = OGL_LOAD(locGetShaderInfoLog_t, glGetShaderInfoLog); +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + locBindVertexArray = OGL_LOAD(locBindVertexArray_t, glBindVertexArray); + locGenVertexArrays = OGL_LOAD(locGenVertexArrays_t, glGenVertexArrays); +#else + locBindVertexArray = glBindVertexArrayOES; + locGenVertexArrays = glGenVertexArraysOES; +#endif + + // Load & Compile Quad Shader - assumes no errors + m_nFS = locCreateShader(0x8B30); + const GLchar* strFS = +#if defined(__arm__) || defined(OLC_PLATFORM_EMSCRIPTEN) + "#version 300 es\n" + "precision mediump float;" +#else + "#version 330 core\n" +#endif + "out vec4 pixel;\n""in vec2 oTex;\n" + "in vec4 oCol;\n""uniform sampler2D sprTex;\n""void main(){pixel = texture(sprTex, oTex) * oCol;}"; + locShaderSource(m_nFS, 1, &strFS, NULL); + locCompileShader(m_nFS); + + m_nVS = locCreateShader(0x8B31); + const GLchar* strVS = +#if defined(__arm__) || defined(OLC_PLATFORM_EMSCRIPTEN) + "#version 300 es\n" + "precision mediump float;" +#else + "#version 330 core\n" +#endif + "layout(location = 0) in vec3 aPos;\n""layout(location = 1) in vec2 aTex;\n" + "layout(location = 2) in vec4 aCol;\n""out vec2 oTex;\n""out vec4 oCol;\n" + "void main(){ float p = 1.0 / aPos.z; gl_Position = p * vec4(aPos.x, aPos.y, 0.0, 1.0); oTex = p * aTex; oCol = aCol;}"; + locShaderSource(m_nVS, 1, &strVS, NULL); + locCompileShader(m_nVS); + + m_nQuadShader = locCreateProgram(); + locAttachShader(m_nQuadShader, m_nFS); + locAttachShader(m_nQuadShader, m_nVS); + locLinkProgram(m_nQuadShader); + + // Create Quad + locGenBuffers(1, &m_vbQuad); + locGenVertexArrays(1, &m_vaQuad); + locBindVertexArray(m_vaQuad); + locBindBuffer(0x8892, m_vbQuad); + + locVertex verts[OLC_MAX_VERTS]; + locBufferData(0x8892, sizeof(locVertex) * OLC_MAX_VERTS, verts, 0x88E0); + locVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(locVertex), 0); locEnableVertexAttribArray(0); + locVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(locVertex), (void*)(3 * sizeof(float))); locEnableVertexAttribArray(1); + locVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(locVertex), (void*)(5 * sizeof(float))); locEnableVertexAttribArray(2); + locBindBuffer(0x8892, 0); + locBindVertexArray(0); + + // Create blank texture for spriteless decals + rendBlankQuad.Create(1, 1); + rendBlankQuad.Sprite()->GetData()[0] = olc::WHITE; + rendBlankQuad.Decal()->Update(); + return olc::rcode::OK; + } + + olc::rcode DestroyDevice() override + { +#if defined(OLC_PLATFORM_WINAPI) + wglDeleteContext(glRenderContext); +#endif + +#if defined(OLC_PLATFORM_X11) + glXMakeCurrent(olc_Display, None, NULL); + glXDestroyContext(olc_Display, glDeviceContext); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutDestroyWindow(glutGetWindow()); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + eglMakeCurrent(olc_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroyContext(olc_Display, olc_Context); + eglDestroySurface(olc_Display, olc_Surface); + eglTerminate(olc_Display); + olc_Display = EGL_NO_DISPLAY; + olc_Surface = EGL_NO_SURFACE; + olc_Context = EGL_NO_CONTEXT; +#endif + return olc::rcode::OK; + } + + void DisplayFrame() override + { +#if defined(OLC_PLATFORM_WINAPI) + SwapBuffers(glDeviceContext); + if (bSync) DwmFlush(); // Woooohooooooo!!!! SMOOOOOOOTH! +#endif + +#if defined(OLC_PLATFORM_X11) + X11::glXSwapBuffers(olc_Display, *olc_Window); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutSwapBuffers(); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + eglSwapBuffers(olc_Display, olc_Surface); +#endif + } + + void PrepareDrawing() override + { + glEnable(GL_BLEND); + nDecalMode = DecalMode::NORMAL; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + locUseProgram(m_nQuadShader); + locBindVertexArray(m_vaQuad); + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + locVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(locVertex), 0); locEnableVertexAttribArray(0); + locVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(locVertex), (void*)(3 * sizeof(float))); locEnableVertexAttribArray(1); + locVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(locVertex), (void*)(5 * sizeof(float))); locEnableVertexAttribArray(2); +#endif + } + + void SetDecalMode(const olc::DecalMode& mode) override + { + if (mode != nDecalMode) + { + switch (mode) + { + case olc::DecalMode::NORMAL: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; + case olc::DecalMode::ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); break; + case olc::DecalMode::MULTIPLICATIVE: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break; + case olc::DecalMode::STENCIL: glBlendFunc(GL_ZERO, GL_SRC_ALPHA); break; + case olc::DecalMode::ILLUMINATE: glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); break; + case olc::DecalMode::WIREFRAME: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; + } + + nDecalMode = mode; + } + } + + void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) override + { + locBindBuffer(0x8892, m_vbQuad); + locVertex verts[4] = { + {{-1.0f, -1.0f, 1.0}, {0.0f * scale.x + offset.x, 1.0f * scale.y + offset.y}, tint}, + {{+1.0f, -1.0f, 1.0}, {1.0f * scale.x + offset.x, 1.0f * scale.y + offset.y}, tint}, + {{-1.0f, +1.0f, 1.0}, {0.0f * scale.x + offset.x, 0.0f * scale.y + offset.y}, tint}, + {{+1.0f, +1.0f, 1.0}, {1.0f * scale.x + offset.x, 0.0f * scale.y + offset.y}, tint}, + }; + + locBufferData(0x8892, sizeof(locVertex) * 4, verts, 0x88E0); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + void DrawDecal(const olc::DecalInstance& decal) override + { + SetDecalMode(decal.mode); + if (decal.decal == nullptr) + glBindTexture(GL_TEXTURE_2D, rendBlankQuad.Decal()->id); + else + glBindTexture(GL_TEXTURE_2D, decal.decal->id); + + locBindBuffer(0x8892, m_vbQuad); + + for (uint32_t i = 0; i < decal.points; i++) + pVertexMem[i] = { { decal.pos[i].x, decal.pos[i].y, decal.w[i] }, { decal.uv[i].x, decal.uv[i].y }, decal.tint[i] }; + + locBufferData(0x8892, sizeof(locVertex) * decal.points, pVertexMem, 0x88E0); + + if (nDecalMode == DecalMode::WIREFRAME) + glDrawArrays(GL_LINE_LOOP, 0, decal.points); + else + glDrawArrays(GL_TRIANGLE_FAN, 0, decal.points); + } + + uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered, const bool clamp) override + { + UNUSED(width); + UNUSED(height); + uint32_t id = 0; + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + + if (filtered) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + + if (clamp) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +#endif + return id; + } + + uint32_t DeleteTexture(const uint32_t id) override + { + glDeleteTextures(1, &id); + return id; + } + + void UpdateTexture(uint32_t id, olc::Sprite* spr) override + { + UNUSED(id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, spr->width, spr->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ReadTexture(uint32_t id, olc::Sprite* spr) override + { + glReadPixels(0, 0, spr->width, spr->height, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ApplyTexture(uint32_t id) override + { + glBindTexture(GL_TEXTURE_2D, id); + } + + void ClearBuffer(olc::Pixel p, bool bDepth) override + { + glClearColor(float(p.r) / 255.0f, float(p.g) / 255.0f, float(p.b) / 255.0f, float(p.a) / 255.0f); + glClear(GL_COLOR_BUFFER_BIT); + if (bDepth) glClear(GL_DEPTH_BUFFER_BIT); + } + + void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) override + { + glViewport(pos.x, pos.y, size.x, size.y); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END RENDERER: OpenGL 3.3 (3.0 es) (sh-sh-sh-shaders....) | +// O------------------------------------------------------------------------------O +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Image loaders | +// O------------------------------------------------------------------------------O + +#pragma region image_gdi +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: GDI+, Windows Only, always exists, a little slow | +// O------------------------------------------------------------------------------O +#if defined(OLC_IMAGE_GDI) + +#define min(a, b) ((a < b) ? a : b) +#define max(a, b) ((a > b) ? a : b) +#include +#include +#if defined(__MINGW32__) // Thanks Gusgo & Dandistine, but c'mon mingw!! wtf?! + #include +#else + #include +#endif +#include +#undef min +#undef max + +#if !defined(__MINGW32__) + #pragma comment(lib, "gdiplus.lib") + #pragma comment(lib, "Shlwapi.lib") +#endif + +namespace olc +{ + // Thanks @MaGetzUb for this, which allows sprites to be defined + // at construction, by initialising the GDI subsystem + static class GDIPlusStartup + { + public: + GDIPlusStartup() + { + Gdiplus::GdiplusStartupInput startupInput; + GdiplusStartup(&token, &startupInput, NULL); + } + + ULONG_PTR token; + + ~GDIPlusStartup() + { + // Well, MarcusTU thought this was important :D + Gdiplus::GdiplusShutdown(token); + } + } gdistartup; + + class ImageLoader_GDIPlus : public olc::ImageLoader + { + private: + std::wstring ConvertS2W(std::string s) + { +#ifdef __MINGW32__ + wchar_t* buffer = new wchar_t[s.length() + 1]; + mbstowcs(buffer, s.c_str(), s.length()); + buffer[s.length()] = L'\0'; +#else + int count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0); + wchar_t* buffer = new wchar_t[count]; + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, count); +#endif + std::wstring w(buffer); + delete[] buffer; + return w; + } + + public: + ImageLoader_GDIPlus() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + // clear out existing sprite + spr->pColData.clear(); + + // Open file + UNUSED(pack); + Gdiplus::Bitmap* bmp = nullptr; + if (pack != nullptr) + { + // Load sprite from input stream + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + bmp = Gdiplus::Bitmap::FromStream(SHCreateMemStream((BYTE*)rb.vMemory.data(), UINT(rb.vMemory.size()))); + } + else + { + // Check file exists + if (!_gfs::exists(sImageFile)) return olc::rcode::NO_FILE; + + // Load sprite from file + bmp = Gdiplus::Bitmap::FromFile(ConvertS2W(sImageFile).c_str()); + } + + if (bmp->GetLastStatus() != Gdiplus::Ok) return olc::rcode::FAIL; + spr->width = bmp->GetWidth(); + spr->height = bmp->GetHeight(); + + spr->pColData.resize(spr->width * spr->height); + + for (int y = 0; y < spr->height; y++) + for (int x = 0; x < spr->width; x++) + { + Gdiplus::Color c; + bmp->GetPixel(x, y, &c); + spr->SetPixel(x, y, olc::Pixel(c.GetRed(), c.GetGreen(), c.GetBlue(), c.GetAlpha())); + } + delete bmp; + return olc::rcode::OK; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END IMAGE LOADER: GDI+ | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region image_libpng +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: libpng, default on linux, requires -lpng (libpng-dev) | +// O------------------------------------------------------------------------------O +#if defined(OLC_IMAGE_LIBPNG) +#include +namespace olc +{ + void pngReadStream(png_structp pngPtr, png_bytep data, png_size_t length) + { + png_voidp a = png_get_io_ptr(pngPtr); + ((std::istream*)a)->read((char*)data, length); + } + + class ImageLoader_LibPNG : public olc::ImageLoader + { + public: + ImageLoader_LibPNG() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + UNUSED(pack); + + // clear out existing sprite + spr->pColData.clear(); + + //////////////////////////////////////////////////////////////////////////// + // Use libpng, Thanks to Guillaume Cottenceau + // https://gist.github.com/niw/5963798 + // Also reading png from streams + // http://www.piko3d.net/tutorials/libpng-tutorial-loading-png-files-from-streams/ + png_structp png; + png_infop info; + + auto loadPNG = [&]() + { + png_read_info(png, info); + png_byte color_type; + png_byte bit_depth; + png_bytep* row_pointers; + spr->width = png_get_image_width(png, info); + spr->height = png_get_image_height(png, info); + color_type = png_get_color_type(png, info); + bit_depth = png_get_bit_depth(png, info); + if (bit_depth == 16) png_set_strip_16(png); + if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png); + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png); + if (png_get_valid(png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png); + if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE) + png_set_filler(png, 0xFF, PNG_FILLER_AFTER); + if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png); + png_read_update_info(png, info); + row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * spr->height); + for (int y = 0; y < spr->height; y++) { + row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png, info)); + } + png_read_image(png, row_pointers); + //////////////////////////////////////////////////////////////////////////// + // Create sprite array + spr->pColData.resize(spr->width * spr->height); + // Iterate through image rows, converting into sprite format + for (int y = 0; y < spr->height; y++) + { + png_bytep row = row_pointers[y]; + for (int x = 0; x < spr->width; x++) + { + png_bytep px = &(row[x * 4]); + spr->SetPixel(x, y, Pixel(px[0], px[1], px[2], px[3])); + } + } + + for (int y = 0; y < spr->height; y++) // Thanks maksym33 + free(row_pointers[y]); + free(row_pointers); + png_destroy_read_struct(&png, &info, nullptr); + }; + + png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png) goto fail_load; + + info = png_create_info_struct(png); + if (!info) goto fail_load; + + if (setjmp(png_jmpbuf(png))) goto fail_load; + + if (pack == nullptr) + { + FILE* f = fopen(sImageFile.c_str(), "rb"); + if (!f) return olc::rcode::NO_FILE; + png_init_io(png, f); + loadPNG(); + fclose(f); + } + else + { + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + std::istream is(&rb); + png_set_read_fn(png, (png_voidp)&is, pngReadStream); + loadPNG(); + } + + return olc::rcode::OK; + + fail_load: + spr->width = 0; + spr->height = 0; + spr->pColData.clear(); + return olc::rcode::FAIL; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END IMAGE LOADER: | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region image_stb +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: stb_image.h, all systems, very fast | +// O------------------------------------------------------------------------------O +// Thanks to Sean Barrett - https://github.com/nothings/stb/blob/master/stb_image.h +// MIT License - Copyright(c) 2017 Sean Barrett + +// Note you need to download the above file into your project folder, and +// #define OLC_IMAGE_STB +// #define OLC_PGE_APPLICATION +// #include "olcPixelGameEngine.h" + +#if defined(OLC_IMAGE_STB) +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +namespace olc +{ + class ImageLoader_STB : public olc::ImageLoader + { + public: + ImageLoader_STB() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + UNUSED(pack); + // clear out existing sprite + spr->pColData.clear(); + // Open file + stbi_uc* bytes = nullptr; + int w = 0, h = 0, cmp = 0; + if (pack != nullptr) + { + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + bytes = stbi_load_from_memory((unsigned char*)rb.vMemory.data(), rb.vMemory.size(), &w, &h, &cmp, 4); + } + else + { + // Check file exists + if (!_gfs::exists(sImageFile)) return olc::rcode::NO_FILE; + bytes = stbi_load(sImageFile.c_str(), &w, &h, &cmp, 4); + } + + if (!bytes) return olc::rcode::FAIL; + spr->width = w; spr->height = h; + spr->pColData.resize(spr->width * spr->height); + std::memcpy(spr->pColData.data(), bytes, spr->width * spr->height * 4); + delete[] bytes; + return olc::rcode::OK; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: stb_image.h | +// O------------------------------------------------------------------------------O +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Platforms | +// O------------------------------------------------------------------------------O + +#pragma region platform_windows +// O------------------------------------------------------------------------------O +// | START PLATFORM: MICROSOFT WINDOWS XP, VISTA, 7, 8, 10 | +// O------------------------------------------------------------------------------O +#if defined(OLC_PLATFORM_WINAPI) + +#if defined(_WIN32) && !defined(__MINGW32__) + #pragma comment(lib, "user32.lib") // Visual Studio Only + #pragma comment(lib, "gdi32.lib") // For other Windows Compilers please add + #pragma comment(lib, "opengl32.lib") // these libs to your linker input +#endif + +namespace olc +{ + class Platform_Windows : public olc::Platform + { + private: + HWND olc_hWnd = nullptr; + std::wstring wsAppName; + + std::wstring ConvertS2W(std::string s) + { +#ifdef __MINGW32__ + wchar_t* buffer = new wchar_t[s.length() + 1]; + mbstowcs(buffer, s.c_str(), s.length()); + buffer[s.length()] = L'\0'; +#else + int count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0); + wchar_t* buffer = new wchar_t[count]; + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, count); +#endif + std::wstring w(buffer); + delete[] buffer; + return w; + } + + public: + virtual olc::rcode ApplicationStartUp() override { return olc::rcode::OK; } + virtual olc::rcode ApplicationCleanUp() override { return olc::rcode::OK; } + virtual olc::rcode ThreadStartUp() override { return olc::rcode::OK; } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + PostMessage(olc_hWnd, WM_DESTROY, 0, 0); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({ olc_hWnd }, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + WNDCLASS wc; + wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wc.hInstance = GetModuleHandle(nullptr); + wc.lpfnWndProc = olc_WindowEvent; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.lpszMenuName = nullptr; + wc.hbrBackground = nullptr; + wc.lpszClassName = olcT("OLC_PIXEL_GAME_ENGINE"); + RegisterClass(&wc); + + // Define window furniture + DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + DWORD dwStyle = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_THICKFRAME; + + olc::vi2d vTopLeft = vWindowPos; + + // Handle Fullscreen + if (bFullScreen) + { + dwExStyle = 0; + dwStyle = WS_VISIBLE | WS_POPUP; + HMONITOR hmon = MonitorFromWindow(olc_hWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi = { sizeof(mi) }; + if (!GetMonitorInfo(hmon, &mi)) return olc::rcode::FAIL; + vWindowSize = { mi.rcMonitor.right, mi.rcMonitor.bottom }; + vTopLeft.x = 0; + vTopLeft.y = 0; + } + + // Keep client size as requested + RECT rWndRect = { 0, 0, vWindowSize.x, vWindowSize.y }; + AdjustWindowRectEx(&rWndRect, dwStyle, FALSE, dwExStyle); + int width = rWndRect.right - rWndRect.left; + int height = rWndRect.bottom - rWndRect.top; + + olc_hWnd = CreateWindowEx(dwExStyle, olcT("OLC_PIXEL_GAME_ENGINE"), olcT(""), dwStyle, + vTopLeft.x, vTopLeft.y, width, height, NULL, NULL, GetModuleHandle(nullptr), this); + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys[0x41] = Key::A; mapKeys[0x42] = Key::B; mapKeys[0x43] = Key::C; mapKeys[0x44] = Key::D; mapKeys[0x45] = Key::E; + mapKeys[0x46] = Key::F; mapKeys[0x47] = Key::G; mapKeys[0x48] = Key::H; mapKeys[0x49] = Key::I; mapKeys[0x4A] = Key::J; + mapKeys[0x4B] = Key::K; mapKeys[0x4C] = Key::L; mapKeys[0x4D] = Key::M; mapKeys[0x4E] = Key::N; mapKeys[0x4F] = Key::O; + mapKeys[0x50] = Key::P; mapKeys[0x51] = Key::Q; mapKeys[0x52] = Key::R; mapKeys[0x53] = Key::S; mapKeys[0x54] = Key::T; + mapKeys[0x55] = Key::U; mapKeys[0x56] = Key::V; mapKeys[0x57] = Key::W; mapKeys[0x58] = Key::X; mapKeys[0x59] = Key::Y; + mapKeys[0x5A] = Key::Z; + + mapKeys[VK_F1] = Key::F1; mapKeys[VK_F2] = Key::F2; mapKeys[VK_F3] = Key::F3; mapKeys[VK_F4] = Key::F4; + mapKeys[VK_F5] = Key::F5; mapKeys[VK_F6] = Key::F6; mapKeys[VK_F7] = Key::F7; mapKeys[VK_F8] = Key::F8; + mapKeys[VK_F9] = Key::F9; mapKeys[VK_F10] = Key::F10; mapKeys[VK_F11] = Key::F11; mapKeys[VK_F12] = Key::F12; + + mapKeys[VK_DOWN] = Key::DOWN; mapKeys[VK_LEFT] = Key::LEFT; mapKeys[VK_RIGHT] = Key::RIGHT; mapKeys[VK_UP] = Key::UP; + //mapKeys[VK_RETURN] = Key::ENTER;// mapKeys[VK_RETURN] = Key::RETURN; + + mapKeys[VK_BACK] = Key::BACK; mapKeys[VK_ESCAPE] = Key::ESCAPE; mapKeys[VK_RETURN] = Key::ENTER; mapKeys[VK_PAUSE] = Key::PAUSE; + mapKeys[VK_SCROLL] = Key::SCROLL; mapKeys[VK_TAB] = Key::TAB; mapKeys[VK_DELETE] = Key::DEL; mapKeys[VK_HOME] = Key::HOME; + mapKeys[VK_END] = Key::END; mapKeys[VK_PRIOR] = Key::PGUP; mapKeys[VK_NEXT] = Key::PGDN; mapKeys[VK_INSERT] = Key::INS; + mapKeys[VK_SHIFT] = Key::SHIFT; mapKeys[VK_CONTROL] = Key::CTRL; + mapKeys[VK_SPACE] = Key::SPACE; + + mapKeys[0x30] = Key::K0; mapKeys[0x31] = Key::K1; mapKeys[0x32] = Key::K2; mapKeys[0x33] = Key::K3; mapKeys[0x34] = Key::K4; + mapKeys[0x35] = Key::K5; mapKeys[0x36] = Key::K6; mapKeys[0x37] = Key::K7; mapKeys[0x38] = Key::K8; mapKeys[0x39] = Key::K9; + + mapKeys[VK_NUMPAD0] = Key::NP0; mapKeys[VK_NUMPAD1] = Key::NP1; mapKeys[VK_NUMPAD2] = Key::NP2; mapKeys[VK_NUMPAD3] = Key::NP3; mapKeys[VK_NUMPAD4] = Key::NP4; + mapKeys[VK_NUMPAD5] = Key::NP5; mapKeys[VK_NUMPAD6] = Key::NP6; mapKeys[VK_NUMPAD7] = Key::NP7; mapKeys[VK_NUMPAD8] = Key::NP8; mapKeys[VK_NUMPAD9] = Key::NP9; + mapKeys[VK_MULTIPLY] = Key::NP_MUL; mapKeys[VK_ADD] = Key::NP_ADD; mapKeys[VK_DIVIDE] = Key::NP_DIV; mapKeys[VK_SUBTRACT] = Key::NP_SUB; mapKeys[VK_DECIMAL] = Key::NP_DECIMAL; + + // Thanks scripticuk + mapKeys[VK_OEM_1] = Key::OEM_1; // On US and UK keyboards this is the ';:' key + mapKeys[VK_OEM_2] = Key::OEM_2; // On US and UK keyboards this is the '/?' key + mapKeys[VK_OEM_3] = Key::OEM_3; // On US keyboard this is the '~' key + mapKeys[VK_OEM_4] = Key::OEM_4; // On US and UK keyboards this is the '[{' key + mapKeys[VK_OEM_5] = Key::OEM_5; // On US keyboard this is '\|' key. + mapKeys[VK_OEM_6] = Key::OEM_6; // On US and UK keyboards this is the ']}' key + mapKeys[VK_OEM_7] = Key::OEM_7; // On US keyboard this is the single/double quote key. On UK, this is the single quote/@ symbol key + mapKeys[VK_OEM_8] = Key::OEM_8; // miscellaneous characters. Varies by keyboard + mapKeys[VK_OEM_PLUS] = Key::EQUALS; // the '+' key on any keyboard + mapKeys[VK_OEM_COMMA] = Key::COMMA; // the comma key on any keyboard + mapKeys[VK_OEM_MINUS] = Key::MINUS; // the minus key on any keyboard + mapKeys[VK_OEM_PERIOD] = Key::PERIOD; // the period key on any keyboard + mapKeys[VK_CAPITAL] = Key::CAPS_LOCK; + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { +#ifdef UNICODE + SetWindowText(olc_hWnd, ConvertS2W(s).c_str()); +#else + SetWindowText(olc_hWnd, s.c_str()); +#endif + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override + { + MSG msg; + while (GetMessage(&msg, NULL, 0, 0) > 0) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override { return olc::rcode::FAIL; } + + // Windows Event Handler - this is statically connected to the windows event system + static LRESULT CALLBACK olc_WindowEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + switch (uMsg) + { + case WM_MOUSEMOVE: + { + // Thanks @ForAbby (Discord) + uint16_t x = lParam & 0xFFFF; uint16_t y = (lParam >> 16) & 0xFFFF; + int16_t ix = *(int16_t*)&x; int16_t iy = *(int16_t*)&y; + ptrPGE->olc_UpdateMouse(ix, iy); + return 0; + } + case WM_SIZE: ptrPGE->olc_UpdateWindowSize(lParam & 0xFFFF, (lParam >> 16) & 0xFFFF); return 0; + case WM_MOUSEWHEEL: ptrPGE->olc_UpdateMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)); return 0; + case WM_MOUSELEAVE: ptrPGE->olc_UpdateMouseFocus(false); return 0; + case WM_SETFOCUS: ptrPGE->olc_UpdateKeyFocus(true); return 0; + case WM_KILLFOCUS: ptrPGE->olc_UpdateKeyFocus(false); return 0; + case WM_KEYDOWN: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], true); return 0; + case WM_KEYUP: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], false); return 0; + case WM_SYSKEYDOWN: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], true); return 0; + case WM_SYSKEYUP: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], false); return 0; + case WM_LBUTTONDOWN:ptrPGE->olc_UpdateMouseState(0, true); return 0; + case WM_LBUTTONUP: ptrPGE->olc_UpdateMouseState(0, false); return 0; + case WM_RBUTTONDOWN:ptrPGE->olc_UpdateMouseState(1, true); return 0; + case WM_RBUTTONUP: ptrPGE->olc_UpdateMouseState(1, false); return 0; + case WM_MBUTTONDOWN:ptrPGE->olc_UpdateMouseState(2, true); return 0; + case WM_MBUTTONUP: ptrPGE->olc_UpdateMouseState(2, false); return 0; + case WM_CLOSE: ptrPGE->olc_Terminate(); return 0; + case WM_DESTROY: PostQuitMessage(0); DestroyWindow(hWnd); return 0; + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: MICROSOFT WINDOWS XP, VISTA, 7, 8, 10 | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region platform_linux +// O------------------------------------------------------------------------------O +// | START PLATFORM: LINUX | +// O------------------------------------------------------------------------------O +#if defined(OLC_PLATFORM_X11) +namespace olc +{ + class Platform_Linux : public olc::Platform + { + private: + X11::Display* olc_Display = nullptr; + X11::Window olc_WindowRoot; + X11::Window olc_Window; + X11::XVisualInfo* olc_VisualInfo; + X11::Colormap olc_ColourMap; + X11::XSetWindowAttributes olc_SetWindowAttribs; + + public: + virtual olc::rcode ApplicationStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ApplicationCleanUp() override + { + XDestroyWindow(olc_Display, olc_Window); + return olc::rcode::OK; + } + + virtual olc::rcode ThreadStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({ olc_Display, &olc_Window, olc_VisualInfo }, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + using namespace X11; + XInitThreads(); + + // Grab the deafult display and window + olc_Display = XOpenDisplay(NULL); + olc_WindowRoot = DefaultRootWindow(olc_Display); + + // Based on the display capabilities, configure the appearance of the window + GLint olc_GLAttribs[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; + olc_VisualInfo = glXChooseVisual(olc_Display, 0, olc_GLAttribs); + olc_ColourMap = XCreateColormap(olc_Display, olc_WindowRoot, olc_VisualInfo->visual, AllocNone); + olc_SetWindowAttribs.colormap = olc_ColourMap; + + // Register which events we are interested in receiving + olc_SetWindowAttribs.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask | StructureNotifyMask; + + // Create the window + olc_Window = XCreateWindow(olc_Display, olc_WindowRoot, vWindowPos.x, vWindowPos.y, + vWindowSize.x, vWindowSize.y, + 0, olc_VisualInfo->depth, InputOutput, olc_VisualInfo->visual, + CWColormap | CWEventMask, &olc_SetWindowAttribs); + + Atom wmDelete = XInternAtom(olc_Display, "WM_DELETE_WINDOW", true); + XSetWMProtocols(olc_Display, olc_Window, &wmDelete, 1); + + XMapWindow(olc_Display, olc_Window); + XStoreName(olc_Display, olc_Window, "OneLoneCoder.com - Pixel Game Engine"); + + if (bFullScreen) // Thanks DragonEye, again :D + { + Atom wm_state; + Atom fullscreen; + wm_state = XInternAtom(olc_Display, "_NET_WM_STATE", False); + fullscreen = XInternAtom(olc_Display, "_NET_WM_STATE_FULLSCREEN", False); + XEvent xev{ 0 }; + xev.type = ClientMessage; + xev.xclient.window = olc_Window; + xev.xclient.message_type = wm_state; + xev.xclient.format = 32; + xev.xclient.data.l[0] = (bFullScreen ? 1 : 0); // the action (0: off, 1: on, 2: toggle) + xev.xclient.data.l[1] = fullscreen; // first property to alter + xev.xclient.data.l[2] = 0; // second property to alter + xev.xclient.data.l[3] = 0; // source indication + XMapWindow(olc_Display, olc_Window); + XSendEvent(olc_Display, DefaultRootWindow(olc_Display), False, + SubstructureRedirectMask | SubstructureNotifyMask, &xev); + XFlush(olc_Display); + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, olc_Window, &gwa); + vWindowSize.x = gwa.width; + vWindowSize.y = gwa.height; + } + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys[0x61] = Key::A; mapKeys[0x62] = Key::B; mapKeys[0x63] = Key::C; mapKeys[0x64] = Key::D; mapKeys[0x65] = Key::E; + mapKeys[0x66] = Key::F; mapKeys[0x67] = Key::G; mapKeys[0x68] = Key::H; mapKeys[0x69] = Key::I; mapKeys[0x6A] = Key::J; + mapKeys[0x6B] = Key::K; mapKeys[0x6C] = Key::L; mapKeys[0x6D] = Key::M; mapKeys[0x6E] = Key::N; mapKeys[0x6F] = Key::O; + mapKeys[0x70] = Key::P; mapKeys[0x71] = Key::Q; mapKeys[0x72] = Key::R; mapKeys[0x73] = Key::S; mapKeys[0x74] = Key::T; + mapKeys[0x75] = Key::U; mapKeys[0x76] = Key::V; mapKeys[0x77] = Key::W; mapKeys[0x78] = Key::X; mapKeys[0x79] = Key::Y; + mapKeys[0x7A] = Key::Z; + + mapKeys[XK_F1] = Key::F1; mapKeys[XK_F2] = Key::F2; mapKeys[XK_F3] = Key::F3; mapKeys[XK_F4] = Key::F4; + mapKeys[XK_F5] = Key::F5; mapKeys[XK_F6] = Key::F6; mapKeys[XK_F7] = Key::F7; mapKeys[XK_F8] = Key::F8; + mapKeys[XK_F9] = Key::F9; mapKeys[XK_F10] = Key::F10; mapKeys[XK_F11] = Key::F11; mapKeys[XK_F12] = Key::F12; + + mapKeys[XK_Down] = Key::DOWN; mapKeys[XK_Left] = Key::LEFT; mapKeys[XK_Right] = Key::RIGHT; mapKeys[XK_Up] = Key::UP; + mapKeys[XK_KP_Enter] = Key::ENTER; mapKeys[XK_Return] = Key::ENTER; + + mapKeys[XK_BackSpace] = Key::BACK; mapKeys[XK_Escape] = Key::ESCAPE; mapKeys[XK_Linefeed] = Key::ENTER; mapKeys[XK_Pause] = Key::PAUSE; + mapKeys[XK_Scroll_Lock] = Key::SCROLL; mapKeys[XK_Tab] = Key::TAB; mapKeys[XK_Delete] = Key::DEL; mapKeys[XK_Home] = Key::HOME; + mapKeys[XK_End] = Key::END; mapKeys[XK_Page_Up] = Key::PGUP; mapKeys[XK_Page_Down] = Key::PGDN; mapKeys[XK_Insert] = Key::INS; + mapKeys[XK_Shift_L] = Key::SHIFT; mapKeys[XK_Shift_R] = Key::SHIFT; mapKeys[XK_Control_L] = Key::CTRL; mapKeys[XK_Control_R] = Key::CTRL; + mapKeys[XK_space] = Key::SPACE; mapKeys[XK_period] = Key::PERIOD; + + mapKeys[XK_0] = Key::K0; mapKeys[XK_1] = Key::K1; mapKeys[XK_2] = Key::K2; mapKeys[XK_3] = Key::K3; mapKeys[XK_4] = Key::K4; + mapKeys[XK_5] = Key::K5; mapKeys[XK_6] = Key::K6; mapKeys[XK_7] = Key::K7; mapKeys[XK_8] = Key::K8; mapKeys[XK_9] = Key::K9; + + mapKeys[XK_KP_0] = Key::NP0; mapKeys[XK_KP_1] = Key::NP1; mapKeys[XK_KP_2] = Key::NP2; mapKeys[XK_KP_3] = Key::NP3; mapKeys[XK_KP_4] = Key::NP4; + mapKeys[XK_KP_5] = Key::NP5; mapKeys[XK_KP_6] = Key::NP6; mapKeys[XK_KP_7] = Key::NP7; mapKeys[XK_KP_8] = Key::NP8; mapKeys[XK_KP_9] = Key::NP9; + mapKeys[XK_KP_Multiply] = Key::NP_MUL; mapKeys[XK_KP_Add] = Key::NP_ADD; mapKeys[XK_KP_Divide] = Key::NP_DIV; mapKeys[XK_KP_Subtract] = Key::NP_SUB; mapKeys[XK_KP_Decimal] = Key::NP_DECIMAL; + + // These keys vary depending on the keyboard. I've included comments for US and UK keyboard layouts + mapKeys[XK_semicolon] = Key::OEM_1; // On US and UK keyboards this is the ';:' key + mapKeys[XK_slash] = Key::OEM_2; // On US and UK keyboards this is the '/?' key + mapKeys[XK_asciitilde] = Key::OEM_3; // On US keyboard this is the '~' key + mapKeys[XK_bracketleft] = Key::OEM_4; // On US and UK keyboards this is the '[{' key + mapKeys[XK_backslash] = Key::OEM_5; // On US keyboard this is '\|' key. + mapKeys[XK_bracketright] = Key::OEM_6; // On US and UK keyboards this is the ']}' key + mapKeys[XK_apostrophe] = Key::OEM_7; // On US keyboard this is the single/double quote key. On UK, this is the single quote/@ symbol key + mapKeys[XK_numbersign] = Key::OEM_8; // miscellaneous characters. Varies by keyboard. I believe this to be the '#~' key on UK keyboards + mapKeys[XK_equal] = Key::EQUALS; // the '+' key on any keyboard + mapKeys[XK_comma] = Key::COMMA; // the comma key on any keyboard + mapKeys[XK_minus] = Key::MINUS; // the minus key on any keyboard + + mapKeys[XK_Caps_Lock] = Key::CAPS_LOCK; + + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { + X11::XStoreName(olc_Display, olc_Window, s.c_str()); + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override + { + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override + { + using namespace X11; + // Handle Xlib Message Loop - we do this in the + // same thread that OpenGL was created so we dont + // need to worry too much about multithreading with X11 + XEvent xev; + while (XPending(olc_Display)) + { + XNextEvent(olc_Display, &xev); + if (xev.type == Expose) + { + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, olc_Window, &gwa); + ptrPGE->olc_UpdateWindowSize(gwa.width, gwa.height); + } + else if (xev.type == ConfigureNotify) + { + XConfigureEvent xce = xev.xconfigure; + ptrPGE->olc_UpdateWindowSize(xce.width, xce.height); + } + else if (xev.type == KeyPress) + { + KeySym sym = XLookupKeysym(&xev.xkey, 0); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], true); + XKeyEvent* e = (XKeyEvent*)&xev; // Because DragonEye loves numpads + XLookupString(e, NULL, 0, &sym, NULL); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], true); + } + else if (xev.type == KeyRelease) + { + KeySym sym = XLookupKeysym(&xev.xkey, 0); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], false); + XKeyEvent* e = (XKeyEvent*)&xev; + XLookupString(e, NULL, 0, &sym, NULL); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], false); + } + else if (xev.type == ButtonPress) + { + switch (xev.xbutton.button) + { + case 1: ptrPGE->olc_UpdateMouseState(0, true); break; + case 2: ptrPGE->olc_UpdateMouseState(2, true); break; + case 3: ptrPGE->olc_UpdateMouseState(1, true); break; + case 4: ptrPGE->olc_UpdateMouseWheel(120); break; + case 5: ptrPGE->olc_UpdateMouseWheel(-120); break; + default: break; + } + } + else if (xev.type == ButtonRelease) + { + switch (xev.xbutton.button) + { + case 1: ptrPGE->olc_UpdateMouseState(0, false); break; + case 2: ptrPGE->olc_UpdateMouseState(2, false); break; + case 3: ptrPGE->olc_UpdateMouseState(1, false); break; + default: break; + } + } + else if (xev.type == MotionNotify) + { + ptrPGE->olc_UpdateMouse(xev.xmotion.x, xev.xmotion.y); + } + else if (xev.type == FocusIn) + { + ptrPGE->olc_UpdateKeyFocus(true); + } + else if (xev.type == FocusOut) + { + ptrPGE->olc_UpdateKeyFocus(false); + } + else if (xev.type == ClientMessage) + { + ptrPGE->olc_Terminate(); + } + } + return olc::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: LINUX | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region platform_glut +// O------------------------------------------------------------------------------O +// | START PLATFORM: GLUT (used to make it simple for Apple) | +// O------------------------------------------------------------------------------O +// +// VERY IMPORTANT!!! The Apple port was originally created by @Mumflr (discord) +// and the repo for the development of this project can be found here: +// https://github.com/MumflrFumperdink/olcPGEMac which contains maccy goodness +// and support on how to setup your build environment. +// +// "MASSIVE MASSIVE THANKS TO MUMFLR" - Javidx9 +#if defined(OLC_PLATFORM_GLUT) +namespace olc { + + class Platform_GLUT : public olc::Platform + { + public: + static std::atomic* bActiveRef; + + virtual olc::rcode ApplicationStartUp() override { + return olc::rcode::OK; + } + + virtual olc::rcode ApplicationCleanUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({}, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + static void ExitMainLoop() { + if (!ptrPGE->OnUserDestroy()) { + *bActiveRef = true; + return; + } + platform->ThreadCleanUp(); + platform->ApplicationCleanUp(); + exit(0); + } + +#if defined(__APPLE__) + static void scrollWheelUpdate(id selff, SEL _sel, id theEvent) { + static const SEL deltaYSel = sel_registerName("deltaY"); + +#if defined(__aarch64__) // Thanks ruarq! + double deltaY = ((double (*)(id, SEL))objc_msgSend)(theEvent, deltaYSel); +#else + double deltaY = ((double (*)(id, SEL))objc_msgSend_fpret)(theEvent, deltaYSel); +#endif + + for (int i = 0; i < abs(deltaY); i++) { + if (deltaY > 0) { + ptrPGE->olc_UpdateMouseWheel(-1); + } + else if (deltaY < 0) { + ptrPGE->olc_UpdateMouseWheel(1); + } + } + } +#endif + static void ThreadFunct() { +#if defined(__APPLE__) + static bool hasEnabledCocoa = false; + if (!hasEnabledCocoa) { + // Objective-C Wizardry + Class NSApplicationClass = objc_getClass("NSApplication"); + + // NSApp = [NSApplication sharedApplication] + SEL sharedApplicationSel = sel_registerName("sharedApplication"); + id NSApp = ((id(*)(Class, SEL))objc_msgSend)(NSApplicationClass, sharedApplicationSel); + // window = [NSApp mainWindow] + SEL mainWindowSel = sel_registerName("mainWindow"); + id window = ((id(*)(id, SEL))objc_msgSend)(NSApp, mainWindowSel); + + // [window setStyleMask: NSWindowStyleMaskClosable | ~NSWindowStyleMaskResizable] + SEL setStyleMaskSel = sel_registerName("setStyleMask:"); + ((void (*)(id, SEL, NSUInteger))objc_msgSend)(window, setStyleMaskSel, 7); + + hasEnabledCocoa = true; + } +#endif + if (!*bActiveRef) { + ExitMainLoop(); + return; + } + glutPostRedisplay(); + } + + static void DrawFunct() { + ptrPGE->olc_CoreUpdate(); + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { +#if defined(__APPLE__) + Class GLUTViewClass = objc_getClass("GLUTView"); + + SEL scrollWheelSel = sel_registerName("scrollWheel:"); + bool resultAddMethod = class_addMethod(GLUTViewClass, scrollWheelSel, (IMP)scrollWheelUpdate, "v@:@"); + assert(resultAddMethod); +#endif + + renderer->PrepareDevice(); + + if (bFullScreen) + { + vWindowSize.x = glutGet(GLUT_SCREEN_WIDTH); + vWindowSize.y = glutGet(GLUT_SCREEN_HEIGHT); + glutFullScreen(); + } + else + { + if (vWindowSize.x > glutGet(GLUT_SCREEN_WIDTH) || vWindowSize.y > glutGet(GLUT_SCREEN_HEIGHT)) + { + perror("ERROR: The specified window dimensions do not fit on your screen\n"); + return olc::FAIL; + } + glutReshapeWindow(vWindowSize.x, vWindowSize.y - 1); + } + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys['A'] = Key::A; mapKeys['B'] = Key::B; mapKeys['C'] = Key::C; mapKeys['D'] = Key::D; mapKeys['E'] = Key::E; + mapKeys['F'] = Key::F; mapKeys['G'] = Key::G; mapKeys['H'] = Key::H; mapKeys['I'] = Key::I; mapKeys['J'] = Key::J; + mapKeys['K'] = Key::K; mapKeys['L'] = Key::L; mapKeys['M'] = Key::M; mapKeys['N'] = Key::N; mapKeys['O'] = Key::O; + mapKeys['P'] = Key::P; mapKeys['Q'] = Key::Q; mapKeys['R'] = Key::R; mapKeys['S'] = Key::S; mapKeys['T'] = Key::T; + mapKeys['U'] = Key::U; mapKeys['V'] = Key::V; mapKeys['W'] = Key::W; mapKeys['X'] = Key::X; mapKeys['Y'] = Key::Y; + mapKeys['Z'] = Key::Z; + + mapKeys[GLUT_KEY_F1] = Key::F1; mapKeys[GLUT_KEY_F2] = Key::F2; mapKeys[GLUT_KEY_F3] = Key::F3; mapKeys[GLUT_KEY_F4] = Key::F4; + mapKeys[GLUT_KEY_F5] = Key::F5; mapKeys[GLUT_KEY_F6] = Key::F6; mapKeys[GLUT_KEY_F7] = Key::F7; mapKeys[GLUT_KEY_F8] = Key::F8; + mapKeys[GLUT_KEY_F9] = Key::F9; mapKeys[GLUT_KEY_F10] = Key::F10; mapKeys[GLUT_KEY_F11] = Key::F11; mapKeys[GLUT_KEY_F12] = Key::F12; + + mapKeys[GLUT_KEY_DOWN] = Key::DOWN; mapKeys[GLUT_KEY_LEFT] = Key::LEFT; mapKeys[GLUT_KEY_RIGHT] = Key::RIGHT; mapKeys[GLUT_KEY_UP] = Key::UP; + mapKeys[13] = Key::ENTER; + + mapKeys[127] = Key::BACK; mapKeys[27] = Key::ESCAPE; + mapKeys[9] = Key::TAB; mapKeys[GLUT_KEY_HOME] = Key::HOME; + mapKeys[GLUT_KEY_END] = Key::END; mapKeys[GLUT_KEY_PAGE_UP] = Key::PGUP; mapKeys[GLUT_KEY_PAGE_DOWN] = Key::PGDN; mapKeys[GLUT_KEY_INSERT] = Key::INS; + mapKeys[32] = Key::SPACE; mapKeys[46] = Key::PERIOD; + + mapKeys[48] = Key::K0; mapKeys[49] = Key::K1; mapKeys[50] = Key::K2; mapKeys[51] = Key::K3; mapKeys[52] = Key::K4; + mapKeys[53] = Key::K5; mapKeys[54] = Key::K6; mapKeys[55] = Key::K7; mapKeys[56] = Key::K8; mapKeys[57] = Key::K9; + + // NOTE: MISSING KEYS :O + + glutKeyboardFunc([](unsigned char key, int x, int y) -> void { + switch (glutGetModifiers()) { + case 0: //This is when there are no modifiers + if ('a' <= key && key <= 'z') key -= 32; + break; + case GLUT_ACTIVE_SHIFT: + ptrPGE->olc_UpdateKeyState(Key::SHIFT, true); + break; + case GLUT_ACTIVE_CTRL: + if ('a' <= key && key <= 'z') key -= 32; + ptrPGE->olc_UpdateKeyState(Key::CTRL, true); + break; + case GLUT_ACTIVE_ALT: + if ('a' <= key && key <= 'z') key -= 32; + break; + } + + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], true); + }); + + glutKeyboardUpFunc([](unsigned char key, int x, int y) -> void { + switch (glutGetModifiers()) { + case 0: //This is when there are no modifiers + if ('a' <= key && key <= 'z') key -= 32; + break; + case GLUT_ACTIVE_SHIFT: + ptrPGE->olc_UpdateKeyState(Key::SHIFT, false); + break; + case GLUT_ACTIVE_CTRL: + if ('a' <= key && key <= 'z') key -= 32; + ptrPGE->olc_UpdateKeyState(Key::CTRL, false); + break; + case GLUT_ACTIVE_ALT: + if ('a' <= key && key <= 'z') key -= 32; + //No ALT in PGE + break; + } + + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], false); + }); + + //Special keys + glutSpecialFunc([](int key, int x, int y) -> void { + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], true); + }); + + glutSpecialUpFunc([](int key, int x, int y) -> void { + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], false); + }); + + glutMouseFunc([](int button, int state, int x, int y) -> void { + switch (button) { + case GLUT_LEFT_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(0, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(0, true); + break; + case GLUT_MIDDLE_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(2, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(2, true); + break; + case GLUT_RIGHT_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(1, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(1, true); + break; + } + }); + + auto mouseMoveCall = [](int x, int y) -> void { + ptrPGE->olc_UpdateMouse(x, y); + }; + + glutMotionFunc(mouseMoveCall); + glutPassiveMotionFunc(mouseMoveCall); + + glutEntryFunc([](int state) -> void { + if (state == GLUT_ENTERED) ptrPGE->olc_UpdateKeyFocus(true); + else if (state == GLUT_LEFT) ptrPGE->olc_UpdateKeyFocus(false); + }); + + glutDisplayFunc(DrawFunct); + glutIdleFunc(ThreadFunct); + + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { + glutSetWindowTitle(s.c_str()); + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override { + glutMainLoop(); + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override + { + return olc::OK; + } + }; + + std::atomic* Platform_GLUT::bActiveRef{ nullptr }; + + //Custom Start + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + if (platform->ThreadStartUp() == olc::FAIL) return olc::FAIL; + olc_PrepareEngine(); + if (!OnUserCreate()) return olc::FAIL; + Platform_GLUT::bActiveRef = &bAtomActive; + glutWMCloseFunc(Platform_GLUT::ExitMainLoop); + bAtomActive = true; + platform->StartSystemEventLoop(); + + //This code will not even be run but why not + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + + return olc::OK; + } +} + +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: GLUT | +// O------------------------------------------------------------------------------O +#pragma endregion + + +#pragma region platform_emscripten +// O------------------------------------------------------------------------------O +// | START PLATFORM: Emscripten - Totally Game Changing... | +// O------------------------------------------------------------------------------O + +// +// Firstly a big mega thank you to members of the OLC Community for sorting this +// out. Making a browser compatible version has been a priority for quite some +// time, but I lacked the expertise to do it. This awesome feature is possible +// because a group of former strangers got together and formed friendships over +// their shared passion for code. If anything demonstrates how powerful helping +// each other can be, it's this. - Javidx9 + +// Emscripten Platform: MaGetzUb, Moros1138, Slavka, Dandistine, Gorbit99, Bispoo +// also: Ishidex, Gusgo99, SlicEnDicE, Alexio + + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + +#include +#include + +extern "C" +{ + EMSCRIPTEN_KEEPALIVE inline int olc_OnPageUnload() + { olc::platform->ApplicationCleanUp(); return 0; } +} + +namespace olc +{ + class Platform_Emscripten : public olc::Platform + { + public: + + virtual olc::rcode ApplicationStartUp() override + { return olc::rcode::OK; } + + virtual olc::rcode ApplicationCleanUp() override + { ThreadCleanUp(); return olc::rcode::OK; } + + virtual olc::rcode ThreadStartUp() override + { return olc::rcode::OK; } + + virtual olc::rcode ThreadCleanUp() override + { renderer->DestroyDevice(); return olc::OK; } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({}, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + emscripten_set_canvas_element_size("#canvas", vWindowSize.x, vWindowSize.y); + + mapKeys[DOM_PK_UNKNOWN] = Key::NONE; + mapKeys[DOM_PK_A] = Key::A; mapKeys[DOM_PK_B] = Key::B; mapKeys[DOM_PK_C] = Key::C; mapKeys[DOM_PK_D] = Key::D; + mapKeys[DOM_PK_E] = Key::E; mapKeys[DOM_PK_F] = Key::F; mapKeys[DOM_PK_G] = Key::G; mapKeys[DOM_PK_H] = Key::H; + mapKeys[DOM_PK_I] = Key::I; mapKeys[DOM_PK_J] = Key::J; mapKeys[DOM_PK_K] = Key::K; mapKeys[DOM_PK_L] = Key::L; + mapKeys[DOM_PK_M] = Key::M; mapKeys[DOM_PK_N] = Key::N; mapKeys[DOM_PK_O] = Key::O; mapKeys[DOM_PK_P] = Key::P; + mapKeys[DOM_PK_Q] = Key::Q; mapKeys[DOM_PK_R] = Key::R; mapKeys[DOM_PK_S] = Key::S; mapKeys[DOM_PK_T] = Key::T; + mapKeys[DOM_PK_U] = Key::U; mapKeys[DOM_PK_V] = Key::V; mapKeys[DOM_PK_W] = Key::W; mapKeys[DOM_PK_X] = Key::X; + mapKeys[DOM_PK_Y] = Key::Y; mapKeys[DOM_PK_Z] = Key::Z; + mapKeys[DOM_PK_0] = Key::K0; mapKeys[DOM_PK_1] = Key::K1; mapKeys[DOM_PK_2] = Key::K2; + mapKeys[DOM_PK_3] = Key::K3; mapKeys[DOM_PK_4] = Key::K4; mapKeys[DOM_PK_5] = Key::K5; + mapKeys[DOM_PK_6] = Key::K6; mapKeys[DOM_PK_7] = Key::K7; mapKeys[DOM_PK_8] = Key::K8; + mapKeys[DOM_PK_9] = Key::K9; + mapKeys[DOM_PK_F1] = Key::F1; mapKeys[DOM_PK_F2] = Key::F2; mapKeys[DOM_PK_F3] = Key::F3; mapKeys[DOM_PK_F4] = Key::F4; + mapKeys[DOM_PK_F5] = Key::F5; mapKeys[DOM_PK_F6] = Key::F6; mapKeys[DOM_PK_F7] = Key::F7; mapKeys[DOM_PK_F8] = Key::F8; + mapKeys[DOM_PK_F9] = Key::F9; mapKeys[DOM_PK_F10] = Key::F10; mapKeys[DOM_PK_F11] = Key::F11; mapKeys[DOM_PK_F12] = Key::F12; + mapKeys[DOM_PK_ARROW_UP] = Key::UP; mapKeys[DOM_PK_ARROW_DOWN] = Key::DOWN; + mapKeys[DOM_PK_ARROW_LEFT] = Key::LEFT; mapKeys[DOM_PK_ARROW_RIGHT] = Key::RIGHT; + mapKeys[DOM_PK_SPACE] = Key::SPACE; mapKeys[DOM_PK_TAB] = Key::TAB; + mapKeys[DOM_PK_SHIFT_LEFT] = Key::SHIFT; mapKeys[DOM_PK_SHIFT_RIGHT] = Key::SHIFT; + mapKeys[DOM_PK_CONTROL_LEFT] = Key::CTRL; mapKeys[DOM_PK_CONTROL_RIGHT] = Key::CTRL; + mapKeys[DOM_PK_INSERT] = Key::INS; mapKeys[DOM_PK_DELETE] = Key::DEL; mapKeys[DOM_PK_HOME] = Key::HOME; + mapKeys[DOM_PK_END] = Key::END; mapKeys[DOM_PK_PAGE_UP] = Key::PGUP; mapKeys[DOM_PK_PAGE_DOWN] = Key::PGDN; + mapKeys[DOM_PK_BACKSPACE] = Key::BACK; mapKeys[DOM_PK_ESCAPE] = Key::ESCAPE; + mapKeys[DOM_PK_ENTER] = Key::ENTER; mapKeys[DOM_PK_NUMPAD_EQUAL] = Key::EQUALS; + mapKeys[DOM_PK_NUMPAD_ENTER] = Key::ENTER; mapKeys[DOM_PK_PAUSE] = Key::PAUSE; + mapKeys[DOM_PK_SCROLL_LOCK] = Key::SCROLL; + mapKeys[DOM_PK_NUMPAD_0] = Key::NP0; mapKeys[DOM_PK_NUMPAD_1] = Key::NP1; mapKeys[DOM_PK_NUMPAD_2] = Key::NP2; + mapKeys[DOM_PK_NUMPAD_3] = Key::NP3; mapKeys[DOM_PK_NUMPAD_4] = Key::NP4; mapKeys[DOM_PK_NUMPAD_5] = Key::NP5; + mapKeys[DOM_PK_NUMPAD_6] = Key::NP6; mapKeys[DOM_PK_NUMPAD_7] = Key::NP7; mapKeys[DOM_PK_NUMPAD_8] = Key::NP8; + mapKeys[DOM_PK_NUMPAD_9] = Key::NP9; + mapKeys[DOM_PK_NUMPAD_MULTIPLY] = Key::NP_MUL; mapKeys[DOM_PK_NUMPAD_DIVIDE] = Key::NP_DIV; + mapKeys[DOM_PK_NUMPAD_ADD] = Key::NP_ADD; mapKeys[DOM_PK_NUMPAD_SUBTRACT] = Key::NP_SUB; + mapKeys[DOM_PK_NUMPAD_DECIMAL] = Key::NP_DECIMAL; + mapKeys[DOM_PK_PERIOD] = Key::PERIOD; mapKeys[DOM_PK_EQUAL] = Key::EQUALS; + mapKeys[DOM_PK_COMMA] = Key::COMMA; mapKeys[DOM_PK_MINUS] = Key::MINUS; + mapKeys[DOM_PK_CAPS_LOCK] = Key::CAPS_LOCK; + mapKeys[DOM_PK_SEMICOLON] = Key::OEM_1; mapKeys[DOM_PK_SLASH] = Key::OEM_2; mapKeys[DOM_PK_BACKQUOTE] = Key::OEM_3; + mapKeys[DOM_PK_BRACKET_LEFT] = Key::OEM_4; mapKeys[DOM_PK_BACKSLASH] = Key::OEM_5; mapKeys[DOM_PK_BRACKET_RIGHT] = Key::OEM_6; + mapKeys[DOM_PK_QUOTE] = Key::OEM_7; mapKeys[DOM_PK_BACKSLASH] = Key::OEM_8; + + // Keyboard Callbacks + emscripten_set_keydown_callback("#canvas", 0, 1, keyboard_callback); + emscripten_set_keyup_callback("#canvas", 0, 1, keyboard_callback); + + // Mouse Callbacks + emscripten_set_wheel_callback("#canvas", 0, 1, wheel_callback); + emscripten_set_mousedown_callback("#canvas", 0, 1, mouse_callback); + emscripten_set_mouseup_callback("#canvas", 0, 1, mouse_callback); + emscripten_set_mousemove_callback("#canvas", 0, 1, mouse_callback); + + // Touch Callbacks + emscripten_set_touchstart_callback("#canvas", 0, 1, touch_callback); + emscripten_set_touchmove_callback("#canvas", 0, 1, touch_callback); + emscripten_set_touchend_callback("#canvas", 0, 1, touch_callback); + + // Canvas Focus Callbacks + emscripten_set_blur_callback("#canvas", 0, 1, focus_callback); + emscripten_set_focus_callback("#canvas", 0, 1, focus_callback); + +#pragma warning disable format + EM_ASM( window.onunload = Module._olc_OnPageUnload; ); + + // IMPORTANT! - Sorry About This... + // + // In order to handle certain browser based events, such as resizing and + // going to full screen, we have to effectively inject code into the container + // running the PGE. Yes, I vomited about 11 times too when the others were + // convincing me this is the future. Well, this isnt the future, and if it + // were to be, I want no part of what must be a miserable distopian free + // for all of anarchic code injection to get rudimentary events like "Resize()". + // + // Wake up people! Of course theres a spoon. There has to be to keep feeding + // the giant web baby. + + + // Fullscreen and Resize Observers + EM_ASM({ + + // cache for reuse + Module._olc_EmscriptenShellCss = "width: 100%; height: 70vh; margin-left: auto; margin-right: auto;"; + + // width / height = aspect ratio + Module._olc_WindowAspectRatio = $0 / $1; + Module.canvas.parentNode.addEventListener("resize", function(e) { + + if (e.defaultPrevented) { e.stopPropagation(); return; } + var viewWidth = e.detail.width; + var viewHeight = e.detail.width / Module._olc_WindowAspectRatio; + if (viewHeight > e.detail.height) + { + viewHeight = e.detail.height; + viewWidth = e.detail.height * Module._olc_WindowAspectRatio; + } + + if (Module.canvas.parentNode.className == 'emscripten_border') + Module.canvas.parentNode.style.cssText = Module._olc_EmscriptenShellCss + " width: " + viewWidth.toString() + "px; height: " + viewHeight.toString() + "px;"; + + Module.canvas.setAttribute("width", viewWidth); + Module.canvas.setAttribute("height", viewHeight); + + if (document.fullscreenElement != null) + { + var top = (e.detail.height - viewHeight) / 2; + var left = (e.detail.width - viewWidth) / 2; + Module.canvas.style.position = "fixed"; + Module.canvas.style.top = top.toString() + "px"; + Module.canvas.style.left = left.toString() + "px"; + Module.canvas.style.width = ""; + Module.canvas.style.height = ""; + } + + // trigger PGE update + Module._olc_PGE_UpdateWindowSize(viewWidth, viewHeight); + // this is really only needed when enter/exiting fullscreen + Module.canvas.focus(); + // prevent this event from ever affecting the document beyond this element + e.stopPropagation(); + }); + + // helper function to prevent repeating the same code everywhere + Module._olc_ResizeCanvas = function() + { + // yes, we still have to wait, sigh.. + setTimeout(function() + { + // if default template, stretch width as well + if (Module.canvas.parentNode.className == 'emscripten_border') + Module.canvas.parentNode.style.cssText = Module._olc_EmscriptenShellCss; + + // override it's styling so we can get it's stretched size + Module.canvas.style.cssText = "width: 100%; height: 100%; outline: none;"; + + // setup custom resize event + var resizeEvent = new CustomEvent('resize', + { + detail: { + width: Module.canvas.clientWidth, + height : Module.canvas.clientHeight + }, + bubbles : true, + cancelable : true + }); + + // trigger custom resize event on canvas element + Module.canvas.dispatchEvent(resizeEvent); + }, 50); + }; + + + // Disable Refresh Gesture on mobile + document.body.style.cssText += " overscroll-behavior-y: contain;"; + + if (Module.canvas.parentNode.className == 'emscripten_border') + { + // force body to have no margin in emscripten's minimal shell + document.body.style.margin = "0"; + Module.canvas.parentNode.style.cssText = Module._olc_EmscriptenShellCss; + } + + Module._olc_ResizeCanvas(); + + // observe and react to resizing of the container element + var resizeObserver = new ResizeObserver(function(entries) {Module._olc_ResizeCanvas();}).observe(Module.canvas.parentNode); + + // observe and react to changes that occur when entering/exiting fullscreen + var mutationObserver = new MutationObserver(function(mutationsList, observer) + { + // a change has occurred, let's check them out! + for (var i = 0; i < mutationsList.length; i++) + { + // cycle through all of the newly added elements + for (var j = 0; j < mutationsList[i].addedNodes.length; j++) + { + // if this element is a our canvas, trigger resize + if (mutationsList[i].addedNodes[j].id == 'canvas') + Module._olc_ResizeCanvas(); + } + } + }).observe(Module.canvas.parentNode, + { + attributes: false, + childList : true, + subtree : false + }); + + // add resize listener on window + window.addEventListener("resize", function(e) { Module._olc_ResizeCanvas(); }); + + }, vWindowSize.x, vWindowSize.y); // Fullscreen and Resize Observers +#pragma warning restore format + return olc::rcode::OK; + } + + // Interface PGE's UpdateWindowSize, for use in Javascript + void UpdateWindowSize(int width, int height) + { + ptrPGE->olc_UpdateWindowSize(width, height); + } + + //TY Gorbit + static EM_BOOL focus_callback(int eventType, const EmscriptenFocusEvent* focusEvent, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_BLUR) + { + ptrPGE->olc_UpdateKeyFocus(false); + ptrPGE->olc_UpdateMouseFocus(false); + } + else if (eventType == EMSCRIPTEN_EVENT_FOCUS) + { + ptrPGE->olc_UpdateKeyFocus(true); + ptrPGE->olc_UpdateMouseFocus(true); + } + + return 0; + } + + //TY Moros + static EM_BOOL keyboard_callback(int eventType, const EmscriptenKeyboardEvent* e, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_KEYDOWN) + ptrPGE->olc_UpdateKeyState(mapKeys[emscripten_compute_dom_pk_code(e->code)], true); + + // THANK GOD!! for this compute function. And thanks Dandistine for pointing it out! + if (eventType == EMSCRIPTEN_EVENT_KEYUP) + ptrPGE->olc_UpdateKeyState(mapKeys[emscripten_compute_dom_pk_code(e->code)], false); + + //Consume keyboard events so that keys like F1 and F5 don't do weird things + return EM_TRUE; + } + + //TY Moros + static EM_BOOL wheel_callback(int eventType, const EmscriptenWheelEvent* e, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_WHEEL) + ptrPGE->olc_UpdateMouseWheel(-1 * e->deltaY); + + return EM_TRUE; + } + + //TY Bispoo + static EM_BOOL touch_callback(int eventType, const EmscriptenTouchEvent* e, void* userData) + { + // Move + if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) + { + ptrPGE->olc_UpdateMouse(e->touches->targetX, e->touches->targetY); + } + + // Start + if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) + { + ptrPGE->olc_UpdateMouse(e->touches->targetX, e->touches->targetY); + ptrPGE->olc_UpdateMouseState(0, true); + } + + // End + if (eventType == EMSCRIPTEN_EVENT_TOUCHEND) + { + ptrPGE->olc_UpdateMouseState(0, false); + } + + return EM_TRUE; + } + + //TY Moros + static EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent* e, void* userData) + { + //Mouse Movement + if (eventType == EMSCRIPTEN_EVENT_MOUSEMOVE) + ptrPGE->olc_UpdateMouse(e->targetX, e->targetY); + + + //Mouse button press + if (e->button == 0) // left click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(0, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(0, false); + } + + if (e->button == 2) // right click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(1, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(1, false); + + } + + if (e->button == 1) // middle click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(2, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(2, false); + + //at the moment only middle mouse needs to consume events. + return EM_TRUE; + } + + return EM_FALSE; + } + + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { emscripten_set_window_title(s.c_str()); return olc::OK; } + + virtual olc::rcode StartSystemEventLoop() override + { return olc::OK; } + + virtual olc::rcode HandleSystemEvent() override + { return olc::OK; } + + static void MainLoop() + { + olc::Platform::ptrPGE->olc_CoreUpdate(); + if (!ptrPGE->olc_IsRunning()) + { + if (ptrPGE->OnUserDestroy()) + { + emscripten_cancel_main_loop(); + platform->ApplicationCleanUp(); + } + else + { + ptrPGE->olc_Reanimate(); + } + } + } + }; + + //Emscripten needs a special Start function + //Much of this is usually done in EngineThread, but that isn't used here + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + // Some implementations may form an event loop here + if (platform->ThreadStartUp() == olc::FAIL) return olc::FAIL; + + // Do engine context specific initialisation + olc_PrepareEngine(); + + // Consider the "thread" started + bAtomActive = true; + + // Create user resources as part of this thread + for (auto& ext : vExtensions) ext->OnBeforeUserCreate(); + if (!OnUserCreate()) bAtomActive = false; + for (auto& ext : vExtensions) ext->OnAfterUserCreate(); + + platform->StartSystemEventLoop(); + + //This causes a heap memory corruption in Emscripten for some reason + //Platform_Emscripten::bActiveRef = &bAtomActive; + emscripten_set_main_loop(&Platform_Emscripten::MainLoop, 0, 1); + + // Wait for thread to be exited + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + return olc::OK; + } +} + +extern "C" +{ + EMSCRIPTEN_KEEPALIVE inline void olc_PGE_UpdateWindowSize(int width, int height) + { + emscripten_set_canvas_element_size("#canvas", width, height); + // Thanks slavka + ((olc::Platform_Emscripten*)olc::platform.get())->UpdateWindowSize(width, height); + } +} + +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: Emscripten | +// O------------------------------------------------------------------------------O +#pragma endregion + + +#endif // Headless + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Auto-Configuration | +// O------------------------------------------------------------------------------O +#pragma region pge_config +namespace olc +{ + void PixelGameEngine::olc_ConfigureSystem() + { + +#if !defined(OLC_PGE_HEADLESS) + +#if defined(OLC_IMAGE_GDI) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_LIBPNG) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_STB) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_CUSTOM_EX) + olc::Sprite::loader = std::make_unique(); +#endif + + + + +#if defined(OLC_PLATFORM_WINAPI) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_X11) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_GLUT) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_CUSTOM_EX) + platform = std::make_unique(); +#endif + + + +#if defined(OLC_GFX_OPENGL10) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_OPENGL33) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_OPENGLES2) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_DIRECTX10) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_DIRECTX11) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_CUSTOM_EX) + renderer = std::make_unique(); +#endif + + // Associate components with PGE instance + platform->ptrPGE = this; + renderer->ptrPGE = this; +#else + olc::Sprite::loader = nullptr; + platform = nullptr; + renderer = nullptr; +#endif + } +} + +#pragma endregion + +#endif // End OLC_PGE_APPLICATION + +// O------------------------------------------------------------------------------O +// | END OF OLC_PGE_APPLICATION | +// O------------------------------------------------------------------------------O + diff --git a/sig b/sig new file mode 100755 index 0000000..65804b4 --- /dev/null +++ b/sig @@ -0,0 +1,9 @@ +export AUTO_UPDATE=true + +source utils/define.sh + +define PROJECT_NAME "C++ProjectTemplate" +define CUSTOM_PARAMS "-std=c++17 -lX11 -lGL -lpthread -lpng -lstdc++fs -lpulse -lpulse-simple" +define LANGUAGE "C++" + +source utils/main.sh diff --git a/utils/.coauthors b/utils/.coauthors new file mode 100644 index 0000000..b904d0f --- /dev/null +++ b/utils/.coauthors @@ -0,0 +1 @@ +sigonasr2 diff --git a/utils/.updateDirectories b/utils/.updateDirectories new file mode 100644 index 0000000..56274ea --- /dev/null +++ b/utils/.updateDirectories @@ -0,0 +1,5 @@ +Java/ +C/ +C++/ +scripts/ +utils/ \ No newline at end of file diff --git a/utils/define.sh b/utils/define.sh new file mode 100755 index 0000000..214fc50 --- /dev/null +++ b/utils/define.sh @@ -0,0 +1,26 @@ +export VARS=("") + +export LANGUAGE="" + +function define() { + VARS+=("$1") + value="${*:2}" + eval export "$1"='$value' +} + +if [[ $(pwd) != *"SigScript" && $AUTO_UPDATE = "true" && $1 != "update" ]]; then + source utils/search.sh + + find . -type f -name md5 -delete + find . -type f -name filelist -delete + + #Check for hashes + FILES=$(cat utils/.updateDirectories) + for f in $FILES + do + search $f + check $f + done +else + echo "Dev build, no checks required." +fi \ No newline at end of file diff --git a/utils/filelist b/utils/filelist new file mode 100644 index 0000000..95ad5ff --- /dev/null +++ b/utils/filelist @@ -0,0 +1,5 @@ +.coauthors +define.sh +main.sh +search.sh +.updateDirectories diff --git a/utils/main.sh b/utils/main.sh new file mode 100644 index 0000000..0a4c92a --- /dev/null +++ b/utils/main.sh @@ -0,0 +1,28 @@ +if [ -z "$1" ] + then + echo "" + echo " Usage: ./sig {args}" + echo "" + printf "====\tCurrent Configuration" + printf "\t=====================" + for t in ${VARS[@]} + do + printf "\n\t%-15s%20s" $t ${!t} + done + printf "\n=====================================================" + echo "" + echo "" + echo " Command List:" + FILES=$(ls -1A ./$LANGUAGE/scripts 2>/dev/null | sed -e 's/\.sh$//' | sed -e 's/^/ /') + for f in $FILES + do + if [ -f "./$LANGUAGE/scripts/$f.sh" ]; then + DESC="$(head -n1 ./$LANGUAGE/scripts/$f.sh)" + printf "\n\t%-15s%-65s" $f "${DESC:1}" + fi + done + echo "" + exit +fi + +./$LANGUAGE/scripts/$1.sh "${@:2}" \ No newline at end of file diff --git a/utils/md5 b/utils/md5 new file mode 100644 index 0000000..349fa70 --- /dev/null +++ b/utils/md5 @@ -0,0 +1,4 @@ +define.sh:3ecab0dffe2adfb950f3eb7c7061b750 - +main.sh:4e6e9f0650ec790ce2c4364db94f0caa - +search.sh:30e1842e9a13452ea883bb6516d28e1c - +.updateDirectories:971afb892e8280cb4c9ad43fb72a46a0 - diff --git a/utils/search.sh b/utils/search.sh new file mode 100644 index 0000000..6707c16 --- /dev/null +++ b/utils/search.sh @@ -0,0 +1,103 @@ +function search() { + FILES2=$(ls -A $1 2>/dev/null) + for g in $FILES2 + do + if [ -d $1$g ]; + then + echo "$1$g is a directory" + search $1$g/ + else + echo "$1$g is a file" + if [ $g != "md5" ] && [ $g != "filelist" ] && [ $g != ".package.files" ]; then + if [ $g != ".coauthors" ] && [ $g != "version_info" ]; then + SUM=$(md5sum < $1$g) + echo "$g:$SUM" >> $1md5 + fi + echo "$g" >> $1filelist + else + echo " ignoring $g..." + fi + fi + done +} + +function check() { + echo "Check $1" + FILES2=$(ls -A $1 2>/dev/null) + if [ -f "$1/md5" ]; + then + echo " md5: http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1md5" + curl -H 'Cache-Control: no-cache, no-store' -s "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1md5" --output /tmp/out + cmp -s $1/md5 /tmp/out + if [ "$?" -ne 0 ] + then + echo " Differences detected!" + cat /tmp/out + while IFS= read -r line + do + IFS=':' read -ra split <<< $line + g="${split[0]}" + echo "LINE -- $g" + if [ "$g" != "md5" ] && [ "$g" != "filelist" ] && [ "$g" != ".package.files" ]; then + if [ -f $1$g ]; + then + if [ "$g" != ".coauthors" ] && [ "$g" != "version_info" ]; then + echo "++Redownload $1$g..." + if [ -f "$1$g" ]; then + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $1$g + else + echo "===Could not find directory, assuming regular scripts directory exists." + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $LANGUAGE/scripts/$g + fi + fi + else + echo "++==Downloading $1$g..." + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $1$g + fi + fi + done < /tmp/out + fi + fi + if [ -f "$1/filelist" ]; + then + echo " filelist: http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1filelist" + curl -H 'Cache-Control: no-cache, no-store' -s "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1filelist" --output /tmp/out + cmp -s $1/filelist /tmp/out + if [ "$?" -ne 0 ] + then + echo " Differences detected!" + cat /tmp/out + while IFS= read -r line + do + IFS=':' read -ra split <<< $line + g="${split[0]}" + echo "LINE -- $g" + if [ "$g" != "md5" ] && [ "$g" != "filelist" ] && [ "$g" != ".package.files" ]; then + if [ -f $1$g ]; + then + if [ "$g" != ".coauthors" ] && [ "$g" != "version_info" ]; then + echo "++Redownload $1$g..." + if [ -f "$1$g" ]; then + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $1$g + else + echo "===Could not find directory, assuming regular scripts directory exists." + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $LANGUAGE/scripts/$g + fi + fi + else + echo "++==Downloading $1$g..." + curl -H 'Cache-Control: no-cache, no-store' "http://sig.projectdivar.com/sigonasr2/SigScript/raw/branch/main/$1$g" --output $1$g + fi + fi + done < /tmp/out + fi + fi + for g in $FILES2 + do + if [ -d $1$g ]; + then + echo "$1$g is a directory" + check $1$g/ + fi + done +}