From 52fb35bd5f49d4cb7dcf39eda5154164be045597 Mon Sep 17 00:00:00 2001 From: Jason Van Cleave Date: Thu, 6 Feb 2020 15:12:08 -0500 Subject: [PATCH] examples --- example-billboard/Makefile | 13 ++ example-billboard/addons.make | 3 + example-billboard/bin/data/.gitkeep | 0 example-billboard/bin/data/dot.png | Bin 0 -> 4900 bytes .../bin/data/shadersGL2/Billboard.frag | 5 + .../bin/data/shadersGL2/Billboard.vert | 16 ++ .../bin/data/shadersGL3/Billboard.frag | 12 + .../bin/data/shadersGL3/Billboard.vert | 30 +++ example-billboard/config.make | 142 ++++++++++++ example-billboard/src/main.cpp | 18 ++ example-billboard/src/ofApp.cpp | 165 +++++++++++++ example-billboard/src/ofApp.h | 45 ++++ example-billboardRotation/Makefile | 13 ++ example-billboardRotation/addons.make | 3 + example-billboardRotation/bin/data/.gitkeep | 0 .../bin/data/shaderGL2/Billboard.frag | 31 +++ .../bin/data/shaderGL2/Billboard.vert | 23 ++ .../bin/data/shaderGL3/Billboard.frag | 35 +++ .../bin/data/shaderGL3/Billboard.vert | 33 +++ example-billboardRotation/bin/data/snow.png | Bin 0 -> 85999 bytes example-billboardRotation/config.make | 142 ++++++++++++ example-billboardRotation/src/main.cpp | 18 ++ example-billboardRotation/src/ofApp.cpp | 195 ++++++++++++++++ example-billboardRotation/src/ofApp.h | 86 +++++++ example-ofxImGui/Makefile | 13 ++ example-ofxImGui/addons.make | 2 + example-ofxImGui/bin/data/of.png | Bin 0 -> 29321 bytes example-ofxImGui/bin/data/of_upside_down.png | Bin 0 -> 43694 bytes example-ofxImGui/config.make | 142 ++++++++++++ example-ofxImGui/src/MyTheme.cpp | 69 ++++++ example-ofxImGui/src/MyTheme.h | 12 + example-ofxImGui/src/main.cpp | 18 ++ example-ofxImGui/src/ofApp.cpp | 218 ++++++++++++++++++ example-ofxImGui/src/ofApp.h | 41 ++++ example-pointsAsTextures/Makefile | 13 ++ example-pointsAsTextures/addons.make | 1 + example-pointsAsTextures/bin/data/.gitkeep | 0 example-pointsAsTextures/bin/data/dot.png | Bin 0 -> 8691 bytes example-pointsAsTextures/bin/data/shader.frag | 8 + example-pointsAsTextures/bin/data/shader.vert | 8 + .../bin/data/shaders/shader.frag | 8 + .../bin/data/shaders/shader.vert | 8 + .../bin/data/shaders_gles/shader.frag | 12 + .../bin/data/shaders_gles/shader.vert | 8 + example-pointsAsTextures/config.make | 142 ++++++++++++ example-pointsAsTextures/src/main.cpp | 18 ++ example-pointsAsTextures/src/ofApp.cpp | 204 ++++++++++++++++ example-pointsAsTextures/src/ofApp.h | 36 +++ example-vboMeshDrawInstanced/Makefile | 13 ++ example-vboMeshDrawInstanced/addons.make | 1 + .../bin/data/.gitkeep | 0 .../bin/data/depth_image.png | Bin 0 -> 19442 bytes .../bin/data/shaders/instanced.frag | 41 ++++ .../bin/data/shaders/instanced.vert | 173 ++++++++++++++ .../bin/data/shaders/instanced_120.frag | 34 +++ .../bin/data/shaders/instanced_120.vert | 162 +++++++++++++ example-vboMeshDrawInstanced/config.make | 142 ++++++++++++ example-vboMeshDrawInstanced/src/main.cpp | 18 ++ example-vboMeshDrawInstanced/src/ofApp.cpp | 190 +++++++++++++++ example-vboMeshDrawInstanced/src/ofApp.h | 42 ++++ 60 files changed, 2825 insertions(+) create mode 100644 example-billboard/Makefile create mode 100644 example-billboard/addons.make create mode 100644 example-billboard/bin/data/.gitkeep create mode 100644 example-billboard/bin/data/dot.png create mode 100644 example-billboard/bin/data/shadersGL2/Billboard.frag create mode 100644 example-billboard/bin/data/shadersGL2/Billboard.vert create mode 100644 example-billboard/bin/data/shadersGL3/Billboard.frag create mode 100644 example-billboard/bin/data/shadersGL3/Billboard.vert create mode 100644 example-billboard/config.make create mode 100644 example-billboard/src/main.cpp create mode 100644 example-billboard/src/ofApp.cpp create mode 100644 example-billboard/src/ofApp.h create mode 100644 example-billboardRotation/Makefile create mode 100644 example-billboardRotation/addons.make create mode 100644 example-billboardRotation/bin/data/.gitkeep create mode 100644 example-billboardRotation/bin/data/shaderGL2/Billboard.frag create mode 100644 example-billboardRotation/bin/data/shaderGL2/Billboard.vert create mode 100644 example-billboardRotation/bin/data/shaderGL3/Billboard.frag create mode 100644 example-billboardRotation/bin/data/shaderGL3/Billboard.vert create mode 100644 example-billboardRotation/bin/data/snow.png create mode 100644 example-billboardRotation/config.make create mode 100644 example-billboardRotation/src/main.cpp create mode 100644 example-billboardRotation/src/ofApp.cpp create mode 100644 example-billboardRotation/src/ofApp.h create mode 100644 example-ofxImGui/Makefile create mode 100755 example-ofxImGui/addons.make create mode 100755 example-ofxImGui/bin/data/of.png create mode 100755 example-ofxImGui/bin/data/of_upside_down.png create mode 100644 example-ofxImGui/config.make create mode 100644 example-ofxImGui/src/MyTheme.cpp create mode 100644 example-ofxImGui/src/MyTheme.h create mode 100644 example-ofxImGui/src/main.cpp create mode 100755 example-ofxImGui/src/ofApp.cpp create mode 100755 example-ofxImGui/src/ofApp.h create mode 100644 example-pointsAsTextures/Makefile create mode 100644 example-pointsAsTextures/addons.make create mode 100644 example-pointsAsTextures/bin/data/.gitkeep create mode 100644 example-pointsAsTextures/bin/data/dot.png create mode 100644 example-pointsAsTextures/bin/data/shader.frag create mode 100644 example-pointsAsTextures/bin/data/shader.vert create mode 100644 example-pointsAsTextures/bin/data/shaders/shader.frag create mode 100644 example-pointsAsTextures/bin/data/shaders/shader.vert create mode 100644 example-pointsAsTextures/bin/data/shaders_gles/shader.frag create mode 100644 example-pointsAsTextures/bin/data/shaders_gles/shader.vert create mode 100644 example-pointsAsTextures/config.make create mode 100644 example-pointsAsTextures/src/main.cpp create mode 100644 example-pointsAsTextures/src/ofApp.cpp create mode 100644 example-pointsAsTextures/src/ofApp.h create mode 100644 example-vboMeshDrawInstanced/Makefile create mode 100644 example-vboMeshDrawInstanced/addons.make create mode 100644 example-vboMeshDrawInstanced/bin/data/.gitkeep create mode 100644 example-vboMeshDrawInstanced/bin/data/depth_image.png create mode 100644 example-vboMeshDrawInstanced/bin/data/shaders/instanced.frag create mode 100644 example-vboMeshDrawInstanced/bin/data/shaders/instanced.vert create mode 100644 example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.frag create mode 100644 example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.vert create mode 100644 example-vboMeshDrawInstanced/config.make create mode 100644 example-vboMeshDrawInstanced/src/main.cpp create mode 100644 example-vboMeshDrawInstanced/src/ofApp.cpp create mode 100644 example-vboMeshDrawInstanced/src/ofApp.h diff --git a/example-billboard/Makefile b/example-billboard/Makefile new file mode 100644 index 0000000..177e172 --- /dev/null +++ b/example-billboard/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=$(realpath ../../..) +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/example-billboard/addons.make b/example-billboard/addons.make new file mode 100644 index 0000000..b5a6e77 --- /dev/null +++ b/example-billboard/addons.make @@ -0,0 +1,3 @@ +ofxRPI4Window +ofxAssimpModelLoader + diff --git a/example-billboard/bin/data/.gitkeep b/example-billboard/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/example-billboard/bin/data/dot.png b/example-billboard/bin/data/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..a87cc7cee8c7ef0136cabbe2c0356d5ecd534c04 GIT binary patch literal 4900 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 WG(KTF_~ugp0000(settings); + + auto app = std::make_shared(); + ofRunApp(window, app); + ofRunMainLoop(); +} diff --git a/example-billboard/src/ofApp.cpp b/example-billboard/src/ofApp.cpp new file mode 100644 index 0000000..8c42246 --- /dev/null +++ b/example-billboard/src/ofApp.cpp @@ -0,0 +1,165 @@ +#include "ofApp.h" + +//-------------------------------------------------------------- +void ofApp::setup() { + ofBackground(0, 0, 0); + + cameraRotation ={0,0,0}; + zoom = -500; + zoomTarget = 200; + + billboards.getVertices().resize(NUM_BILLBOARDS); + billboards.getColors().resize(NUM_BILLBOARDS); + billboards.getNormals().resize(NUM_BILLBOARDS,glm::vec3(0)); + + // ------------------------- billboard particles + for (int i=0; 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∓on(=u{hXKGFwUac0KeQjGkG_~Yw`0H7f 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 Q)u40KH9k#;s5{u literal 0 HcmV?d00001 diff --git a/example-billboardRotation/config.make b/example-billboardRotation/config.make new file mode 100644 index 0000000..e707f93 --- /dev/null +++ b/example-billboardRotation/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +# OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +# +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +################################################################################ +#PROJECT_LDFLAGS=-lEGL_mesa + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +#PROJECT_DEFINES = + + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/example-billboardRotation/src/main.cpp b/example-billboardRotation/src/main.cpp new file mode 100644 index 0000000..50302d0 --- /dev/null +++ b/example-billboardRotation/src/main.cpp @@ -0,0 +1,18 @@ +#include "ofMain.h" +#include "ofApp.h" +#include "ofxRPI4Window.h" + +//======================================================================== +int main( ){ + + ofSetLogLevel(OF_LOG_VERBOSE); + + ofGLESWindowSettings settings; + settings.setSize(1280, 720); + settings.setGLESVersion(2); + auto window = std::make_shared(settings); + + auto app = std::make_shared(); + ofRunApp(window, app); + ofRunMainLoop(); +} diff --git a/example-billboardRotation/src/ofApp.cpp b/example-billboardRotation/src/ofApp.cpp new file mode 100644 index 0000000..4c1b041 --- /dev/null +++ b/example-billboardRotation/src/ofApp.cpp @@ -0,0 +1,195 @@ +#include "ofApp.h" +#include "ofxRPI4Window.h" + +int xPosition = 0; +int yPosition = 0; +int previousX = 0; +int previousY = 0; +bool useMouse = false; + +//-------------------------------------------------------------- +void ofApp::setup() { + ofBackground(0); + ofSetVerticalSync(true); + + + // billboard particles + + + + if(ofIsGLProgrammableRenderer()){ + shader.load("shaderGL3/Billboard"); + }else{ + shader.load("shaderGL2/Billboard"); + } + + ofDisableArbTex(); + texture.load("snow.png"); + + // we are getting the location of the point size attribute + // we then set the pointSizes to the vertex attritbute + // we then bind and then enable + +} + +//-------------------------------------------------------------- +void ofApp::update() { + + if (ofGetFrameRate() > 30) + { + particleSystem.addParticle(); + + shader.begin(); + // set the vertex data + vbo.setVertexData(&particleSystem.positions[0], particleSystem.count, GL_DYNAMIC_DRAW); + int pointAttLoc = shader.getAttributeLocation("pointSize"); + vbo.setAttributeData(pointAttLoc, &particleSystem.pointSizes[0], 1, particleSystem.count, GL_DYNAMIC_DRAW); + + // rotate the snow based on the velocity + int angleLoc = shader.getAttributeLocation("angle"); + vbo.setAttributeData(angleLoc, &particleSystem.rotations[0], 1, particleSystem.count, GL_DYNAMIC_DRAW); + shader.end(); + } + + if(useMouse) + { + xPosition = ofGetMouseX(); + yPosition = ofGetMouseY(); + previousX = ofGetPreviousMouseX(); + previousY = ofGetPreviousMouseY(); + }else + { + previousX = xPosition; + previousY = yPosition; + xPosition = ofGetFrameNum() % ofGetWidth(); + yPosition = ofGetFrameNum() % ofGetHeight(); + + if(ofGetFrameNum() % 60) + { + previousX = (int)ofRandom(ofGetWidth()); + } + if(ofGetFrameNum() % 90) + { + previousY = (int)ofRandom(ofGetHeight()); + } + } + + glm::vec2 mouse(xPosition, yPosition); + glm::vec2 mouseVec(previousX-xPosition, previousY-yPosition); + glm::clamp(mouseVec, 0.0f, 10.0f); + + + for (int i=0; i ofGetWidth()) particleSystem.positions[i].x = 0; + if(particleSystem.positions[i].y < 0) particleSystem.positions[i].y = ofGetHeight(); + if(particleSystem.positions[i].y > ofGetHeight()) particleSystem.positions[i].y = 0; + + glm::vec2 center(ofGetWidth()/2, ofGetHeight()/2); + glm::vec2 frc = particleSystem.origins[i] - particleSystem.positions[i]; + if(glm::length(frc) > 20.0) { + frc = glm::normalize(frc); + frc *= 0.84; + particleSystem.velocities[i] += frc; + } + + // get the 2d heading + float angle = (float)atan2(-particleSystem.velocities[i].y, particleSystem.velocities[i].x) + PI; + particleSystem.rotations[i] = (angle * -1.0); + } +} + +//-------------------------------------------------------------- +void ofApp::draw() { + ofEnableAlphaBlending(); + ofSetColor(255); + + shader.begin(); + ofEnablePointSprites(); + + + texture.getTexture().bind(); + vbo.updateVertexData(&particleSystem.positions[0], particleSystem.count); + + // rotate the snow based on the velocity + int angleLoc = shader.getAttributeLocation("angle"); + vbo.updateAttributeData(angleLoc, &particleSystem.rotations[0], particleSystem.count); + + vbo.draw(GL_POINTS, 0, particleSystem.count); + texture.getTexture().unbind(); + + ofDisablePointSprites(); + shader.end(); + + ofxRPI4Window* winptr = static_cast(ofGetWindowPtr()); + + string info = winptr->getInfo(); + info += "\n count: " + ofToString(particleSystem.count); + + ofDrawBitmapStringHighlight(info, 20, 20); +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + if(key == 'f') { + ofToggleFullscreen(); + } +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button) { +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button) { + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button) { + +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/example-billboardRotation/src/ofApp.h b/example-billboardRotation/src/ofApp.h new file mode 100644 index 0000000..84b280a --- /dev/null +++ b/example-billboardRotation/src/ofApp.h @@ -0,0 +1,86 @@ +#pragma once +#include "ofMain.h" +#include "ofVbo.h" + + + +class ParticleSystem +{ +public: + + + vector positions; + vector velocities; + vector origins; + + vector pointSizes; + vector rotations; + + int count; + ParticleSystem() + { + + } + void addParticle() + { + count++; + glm::vec2 pos; + glm::vec2 vel; + glm::vec2 home; + float pointSize; + float rotation; + + pos.x = ofRandomWidth(); + pos.y = ofRandomHeight(); + vel.x = ofRandomf(); + vel.y = ofRandomf(); + home = pos; + pointSize = ofRandom(2, 40); + rotation = ofRandom(0, 360); + + + positions.push_back(pos); + pointSizes.push_back(pointSize); + rotations.push_back(rotation); + velocities.push_back(vel); + origins.push_back(home); + } + + +}; + +class ofApp : public ofBaseApp { +public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + ofVbo vbo; + ofShader shader; + ofImage texture; + + ParticleSystem particleSystem; +}; + + + + + + + + + + + diff --git a/example-ofxImGui/Makefile b/example-ofxImGui/Makefile new file mode 100644 index 0000000..177e172 --- /dev/null +++ b/example-ofxImGui/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=$(realpath ../../..) +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/example-ofxImGui/addons.make b/example-ofxImGui/addons.make new file mode 100755 index 0000000..de6b52a --- /dev/null +++ b/example-ofxImGui/addons.make @@ -0,0 +1,2 @@ +ofxImGui +ofxRPI4Window diff --git a/example-ofxImGui/bin/data/of.png b/example-ofxImGui/bin/data/of.png new file mode 100755 index 0000000000000000000000000000000000000000..21910babf6d8ad862f43fcc9f606dbdefeadf2cb GIT binary patch literal 29321 zcmX6^1yoee_a~*hq`OO6sik38L>g%okd$tOrMo+&r9ncZ7ZjvaT0&y!h9!iBU3UNb z{r%rL@64QcX6D^@=iWP?8!tg$Pn(RGi5LqDiwvlvVTgr=jp<@z5#nK*n~>M1n1;wx z$J_@Ci-hLC8yl;z_%Rk1?qg?lb$xv&4_^--Cl5~!pt?GTr?QZZH!hJB1ki71Hp@8Xo`?i!Tf7>xU`FAfmT!KQm6`Q$_I zkHN9Q!9h>+#hH=uoCxW`LMwgaZx;oMh6lPej=IP)Cba8Ku zbhPmfGf)jPcnfqP#tfb(e}uVg@{rW{x5Gab@wstL9tlOoj|t!tl29oVO5o{;i3&v# z@Zv^cMd3tYN8zetsdK3-eaDHdB=vYa!f5^YIiuN=bvtT1;8~HQp|XEPrYZwWDy{_*FhUGjb6lm2riW$Gu4J{^AT@(NNJSC?=5qg6QhS zcHX9~NE!EM^=T7WqJI4}#ik7vT}FS!W`*rAUjlQ2ZANW+c9tSvj<~33sM;r8Q|p^t ztJ1zCBzsI#Vhku4hn%)woIMe z+%riLNvZa|ceXzrrrM`k1eT29&98cS8hlNbi-;d4GV85nlE2va86C6B9?2|7m%h(& z6?Oxx2(FpThxV9#X=z2DX%qq5`OzgzfKwQ0O2I?>z!We)BzWL1vN}nF{;Swsr-;v8 ze-3AZUW=D`uSfrG?E4~JS&wCxw)Y6~h7v?T@7c3naW`~S)U&uSHfI1|*oP6|vC;l- zp3(=uuvyL1=h`hiHV*-zzh4wt2At1t7!828-mKfT@*_$e1}KAqV16jey8s4d=}^fB z16cH6dn4}pJu<)l zEDjk+E79HsiKt&ICX%IVGjgg$*G9ai9q?{AF9#6&|7yJXM&Rxz+NrkQlxv{!$b&OX ztB39iP5iN9fn=JA_upFHn>x!-;*x{BNlMaD2KRrZkHc{$u79n;ltXW2Z`vKQ4Ya6C z0<%mhyw90K?};q>@tX9#dz&MmI3oTHkP)q;68w-ipDZ8nqE?$H1=K%FtXH0|ljCQf z2ILt;zh-G-i)8Y!O`ATV^R?OQozg0?eBhShHyz=dOS?VGhzs`LaQ zc+zh^nzl;iFq>b-S5(!!&L^U?fPWty(E3l6`OF7eF_dp9JTus`O;BY2F zF}}7wcF_zi#`3?5o)4aDdgb&`>g30B!>jWnLyz+b6&i_Pc zGmOqZVCQx%#2F-Ygl>c2H5CMz0=*s#Zpi^_Mg52C%p5Tr^a zOuJXP2nrq^VsDbXg+wVw8xyKJ_TfsvYUp0D>cSwg%{l@W>?$y@-6ln`PF*y>vx6vqCSK{AxZ&kYaXbX->L z+TfvSNx+RFy>BJ4f(BWAhP4UoIuT392QGI4_p_=z_K>zwmKkHFa{0Z``IoUDV?y~P z={{`;;e&H#9V+7yqZI_^tXe|->W0q3UymuV>kWoUKx2tCtvP(T5v68~D1zx(1#wy6 zXrNHb-1I; zc$G!4>3Z90HuFniZzyGu{Q^k*i&lmr07pKU_5E8DOR*$4;_ZCzLP)V;;?0O$CLs!* zkH|_biE7G8ZPF@B4a(+PDf>1&@wCo<0HK%(x~;4ZV0a7P@P@^aqsB42<c+#kYL)*ibbfu{b z2Po9GDH@z(2;wG0$;}k$G?1!#=yKI{gyJKoX2jWbXJ=st{T;y>Cb<^@=)$qfH}fkB z+SkkdIWK0XXi#esLrug*q;XK@uQ2MKV7~AATd0CR*$G(9YDrpM$!X@_ZDTTL9~dek zqQO#^+Vd)(A#K3m>3}>XxT7VU`x~gz93L5MTS

rd_Z;uxd0|Ej1(^;yZkLT|pxu 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 literal 0 HcmV?d00001 diff --git a/example-ofxImGui/bin/data/of_upside_down.png b/example-ofxImGui/bin/data/of_upside_down.png new file mode 100755 index 0000000000000000000000000000000000000000..8228960ffdef4085f4d9519e3566dde677a7a81e GIT binary patch literal 43694 zcmY(r3p`VQ{69W~B6OEqiV$-tm*l!WlxteZHKt-N3FS6(+34m|Zn;f!O+vXXmy#JH zv(?Sy19suq!0)M60x+n zVg~~80EaxF{Q|%rx8Qf)d!It=%uPU5z0wQ7htr-Gb~YeTq#_6u`ve5q22RD!gFs>D zL7>IkAdvnm5J>z%F5cD<_~O6=3zrZONcia9FApd?_ayKz7r&d%q0Tnf^gV+D)bDr& z-G!@11Uvw)27wGC^nt?wc<7ze5drrDL-Zqz%tA2{ASts!^%ze_^>jpUqdZk#p^ z3WlH7QP);KFJ~-t`t)hTU@vcdyDMh@dpq#SNX|Dj^nt#H1_FUlM`)=B1^Z}R(9_e? zIIpRpsi_8Bp%#J+480Sf78oM`KM(mo&$$8*@eKBR5b75cczW--ckTv-g&N7p?G5yQ zfBt8lp?==~??{0m|GO+;ff{??Xk1V~uknAM4cuzDcUB)7><0%%-h00B1;hWY{QsT% z-*F5z_6Gm|Oy+-9`rlb#sm4Nv8vl3OjD@a!QE~x+E`uzu{BtvcXL;fPA>6}3oX&UW zoy7^!S0#rx{2o{wexTZRM&~<^o$WvW9D8v2>y7Ti@y8C{{a5?UQJtG!4^H)a-7vkD z-gD;Y4Qa`M4|)OgPeehK*wP4MWv3a<6r=4B5NPAM)wSHHAy^cy2^Cdols`7H8eVT8 zbtj5FElZqOf^Ci7WAdRXV)s3^!aVACn}}Omi_;-n1@r?2AB<+si0MUg%!1a<#vq&y zZp2PS-*!dO+*%5RrNo`ttSdEIng1(AXqCFp-6e9jRvtr`k5lpy5ZL+~aT%ji)RDX9jMEDFozKW9-5V%_g=1$D zYmELJPU)OBLbd5ex2=eyro=b#`r94r)0LBpm7jukJ_Q*>ZttMTv@s5uyMrFvX{PO* zGNPd>W;Uv5+f`#+;B=$Bp5YEAh=p0HByU%W5hvJ%koEXa#BC?;;^r6eX8JsfJ#F1Q zW8F)o*-XyZY}Oe5eGbj_fNbyHk=?vwkg`orMi8bqH8|ghm*VYdxx0D9HAF9Gn7i#E z`KX94#+`x~Hg*`TKD>CcKty2#S0CM7Z}`<0vik$FyG-6~L?f=ub>MbKad|QQf-(Ig zzE^ttpIp~p9cZ45YMvYE_TVr=>P{I_c*HKzE9>UD6j}CTpL*i%N*`>qChKF}-u@uI zY9Mh0G(`~gx>!bJa-@KH6n%H@!kSHU{FnUQ6z*S0?|>LwuW`~2Q~|3 zWkB_Ibh)$S+@js@WcK%3G1g155o%`iGvny^!Mt6D2A84dDrP1h{W`DP8a87j`3keS z2H~#tJ$rNN*TV=UGI@7`JTWLb{oth&b;-C68u8_5FJ}zB6Ert(Ui5G?khU2ph;-P_ zVErQ&*+25%o=U4paHvFfR*LVyXL_+Ldb5u+Qd_t_=WE3L3T1zNOt2fG%buQ~ZUEc! zLv2MoWH8Srdn%#-nXU_jhV1kABmR{l{=I*)Nz2f?8C4WBK7DGKw4{XkqtrVI z%xHJNxTSpEgEb8FW~C18)#`iO+6K zGungL?eUu3kHK|b`h`SwF5z7|sE<1GcxvDj!|+E*5BaYQd0^0Z<2`f&d5}hZ zNqc*Ew8MC_T8)Wj#-o|b(B1ctFiIX{D3X^`RUQ4S92T}I&iUeTNlAmCE2J&Rzn|H3 zZ0a-AEWUiyl~b_OP+(Bh<4%1t#5I7IoO8g+=g!2v+2sII$RepinTo{2c7wLno=2UWv$k;q8_m{`+uiBmQIpZiSwR(1> z$#}u`#?+qciTdDmNAda@m!#emE~|jcl3^b!)hw^0?M~7rKJ~bLE$iv>W!h_hx#f^- zIJLCvW+~6|E^a)(ebbzRTQ78vD+oKtY|}tqZ);^B0wD@{YFKTzsqU+sIWD`Pp!=f6 zS(3C%yyHQ(rz&;1SR-ZuuvF(7aF;*4E8?FPJE`tYRo2k!@O(Q}v|(|lmGtP|!eEbx zt~D9De&x16(>5I)dqySs6v&bCY=;AD)cX8HqYjZQ@bt|k33Yl=*pZa-=c%12?{6clNe|o`~ zHM~*>YJZduFPQBrbPbK z8?}PM#9cVCvbe~rFt5=#kKuAxPVxyRcZ0|oo{PN_G@nA4dVCQnN$HE1YLk29Frlc|uK*Qo_0m$-tbyqr$3;kUwH zufhW>+G|`jwIk*Rozq6Fu#lZvNFz1Dn4nR^mb79B5oe6*yhcUNp}AXV?yB;DMx741 zQ0MaK#vPqU4?TUF-z!a=O;eRQX~qE$c&RHM!uoH>ca3U&$|aj*&l-sHONsi zsoYZTdci7&s1ou-%G))&H*FViY@7dJn{GW_%Gc~}vxYI!ssh7Kvi?)bBsHNTW zYuJr7DFi3&%TiP2;BNiM*}6hYY2*&M9=%gvUpLNC(a_#75oYI=?qdsBlwS~~ z&Hu|YD9UcP0A!#XZ7R&>E*I?98j+>y6USt|k$NU+wiNCjLf0ZhvP>?+d%?Gat zu?>p_jp=cM@ce}zHroTTy8|H`GjYbM*w;B4EIKh^{C9*^rUpKPB}bQ%e~!8e`!m14 zn+zyOSf?h9AH+o} zkX4BbZ}cp*lBl_J{Z-!PvBYFpd{CuyV4x2RX;tkNf-NpG+{S{fPtg17QYDa;X1I+z zKR%!BQ;rJtQkCqnTKufmqfpA@eBh9J9_rkxb+VZ2BB($%{IVXBIz2tb} z%P*>=XdQ}Jz`o`cUyw_*m4 z&-2RN0?`6&xzewN?v)9r*PS^kIC|FHaVGZ%dK+qvfoMO^G&fc?Sv1-Hkg9=q%b$v| zmA#k*FFp`dr^@BB00bfJpHDpqn02&Mt-NYvOF?w}#TxJEKkbgQh6*vBNZ|kmSOB%b zeI!nJohGxY_ChFtdA^&QeIeFQv4-R*Ka-qrnkAY$Yx`4foZGT zfc4%w9{dU`UlJVxLOuV^+kUlq-lxHF3H?SkTW!a(p&V_;e_Nn*vxyDq}9dHZwTm_}19Bvc0@OYvx^24WC*qbdI$ z%D;gcr4#!tDT$Cqew!Y7F=!&LU`!UOydm9O$j=E>k$7i7FM`T{PhZ?-1G1W)pUtI3 zSb^#2R`KZ8!vQ2Ito7C{;>In5<9bq2F5$bcIx_46>srW2t8q>&gz&|H;hL1%p92@3W6N9IPV9G^i&VMhJZHF23PRYIk>24)N)d8;?a( zG1Y99mZ+|veR-N8o{hK5poo3H2~zqGeQiv`^V3e~QgES+L!-x;NUMjQO*zq}Jq&pd z2tyt+2;aHyINPrvJ5!w|4o@a9P{msi3{lu@#|P?H(xgl=mx_#bq9}1C*o;*<2*%^S zUVwNr0EL+Q*;C5NsLGZgjj!X*isbim#J{>6GlP<2^del1ne4S{_Jo`!C576dw63g$ z900<$j>_anBdBZsDg}pu@K^LWV#xEWhLX1yj^}@Kjw7mQp_Jcge_j)+E|ZSY}qz15ulmfL6=>OuD}`vDe+g0 z#~B$(b8^P6sF4a@L`ca>=tl{?LB?4??j z1P%v4#Fc~@gQ0&l5pkNsVP`+~6v7|k0|yUsvgbOxV{Z$hFldCQ_2YPiml=#voHFsW z`YP-7aG@|)8xu|oyK}#5(yvQLTN%OFrFw9vG7H$_sM^wFqn*M`C$I${C);Ohs+)l@ zfG?D9D7R{6Kjhw{bF;V%k6!o*X40uhA8$NvxsG=jD zhiHgUU6gAF{AmL0Om$uXPOp7-Yl>4u{0U~`$l*OL4!v79^Nmp}9YRrdfG6jEfh17@ zsCr5BJzS*nH`fu9NX;S&ao(nD+T(leHOY?}(YD8Je{K=(r;4a*XOu2r16*tmPxFdv_NQf+qeE zX$ksv<4H!=x2}01w&|y8O3uz=RhO14IqTaBl2DDG4<-OUoB!Y?(?cHzL`9<%v)yI zAD@3R@K9_+^&UVgzmP_EcLCy3EW|3+aK{E)Sx9TaRVOL{Vds`4i7yun&u>jpblNjS z7SE%^)F<_q7U11KauX8rZxGvoX;mzV0VxaLc{ zth9Wt#D`U0X#FGdPJ^BIDZu!GL4gZVx~${zj??`v!1h&_0b4fKbT!so1VkS@cgXvU zg|`vnpgkgS7)Z^7q+K}Kw(GtD0n6hk|2JS}o9-iwtrWtMvK6iFHMk#8=eQbQx3?Z^ zZu|!U1@L;UF!9z^FQO#a(Y{EsyP;2(Y8V3SFoPlc?iSifg{P?z zFh|OHPu7Z7ejARvjgu8%FGj>^n?xOE{)k`kjg!6X6nLK>ol)(W#;6!~#vG)(E8{-T z<_v~KeFQU2k8+f?=m@^ITFi8EzaTr0ictUOBfHS@)Zi-@?9kI#@=j*Z;290R5AKu( z2dJ{)KuM2bcCY>2!h5>!8KNs!DSffz3VFt5m|?LfU{C(EqT#6=Lb~{aY|Yh28%KQQ z3%(X^K@zI)Ex(amIq37l=XG=iU-zE0RI6Q=(@1I)V*gsfAMsu3$+F0?(X@;<>-9w#N~oam?O!Rf?I1+B~y z>p1g>`0I(7!LTu%IEd$26(uC_X^gn22yf9iF4dfx^`BkYwa_Mh+A{6DsV*)x>v!xY ztqLMPooE)$aM||4uod(A?Ph!J@veKDqRKtUp?73y;#zRG{PNH^D>(c#d>{J@We~Py9uRm>nS139rOAjs9Zvkvdg8_Hou(e-HG% zO^pT^4QuZQi6-XfeS?*2jqlgHA7$q0&E=7#0!Td!1ZCK!tUIbrqq;p9@N99AP-aQB zn+rz>NQ~g(;J&MY_YI4!q$2BpNIdaY8)GTYxXWrh{`SAr$ranCn{W3Y;Af}W&$CNz zd3le7h~H%aR7P(Q{F7mm@QIH+=nYk{kt-i{&$t&9l|#O3P5RpKhc8+5D1KYP)eX|4 z1c(HK@))Q#|IxWGJ#w;w!o7DsvAcZl_Neo60mN!==5Ub56;P;yw~@M`Q(z437YLK2 z#SmcoHWhRS)s6oSY%FQloOnyOQPlwA7U1W7%)i*@k_K!RPq5}6{Tx`bN+8zUn9r2T zF;+F!sw6X-cp=v9Pi;IUBBSlSlU(PNQ=M99?%MP6TG2_HfW!`O_Fh}6*Y{#IzBf)P zZW8kKFFFe38YD&^1=^gBSQvdZ#NX(=ph55U@qIg`>v}3=PT7I(lyAwW){R!6BjBRU zIn#%_>Q!lotvK?OPOPj<{#r7oV?0jw-Q37qdLm(+QVT zSgh3{?{Q~GlxRLR_S=5t^*fuQG`eWzSReHO(_nNx%aP*YQnO#^vlAv!vmAucWQn+w zu3;NxZf(0RC>DNyY7B_$II}VAaA9$eDjM)#Z$DStdWTLyN3M0acO_+Z^gj7(N3NEB&2Q4sd0P_Hx{23lJbLiyx%#Mab z?jJI9ubHG9?yO95r4NnrcMSc_;N|qcu=oDFV5mSTa2i(>D+Cas%api`B}!gn$zpI0 zha7f3r32c3oFPZ=D;;=-b*6$K)&_zUXn{w&iTFP}#GM>oPPV{gIZs8bN4*^Th_xxU z0Y0(mNO3ATXEuK%s+WP7I2*%3#%hPY&&{OzD3pz96l}clZ3!Zy#Q(I1*I)#bsAXcp zYyh)O4%&MIDY^m$s@v7543Gu9=wavHTKOrgHh_Kj-WnFiLZSz#cQ?BH`8m!U`muP& ziXPFT1zx(8eRh)dpvltd;a+=QPH1{re7sWRe@Vy$$d8eTA%v#ucjL|kGr!+4c<{>B z`}hSx45W0xtVQ|uD;}%*0`g*mGm55|uIwdX9Vo=~mwZC3@w(oja3!;V{cI?R`y+3G z7e189^DF~d0%yet1c;6UOR5_z%l)<7d63ipoT}&O4QFXZ<{6sLKK~2o-E|MebZyMk z^C2o))dk@t2~RG4f?zs~CbU2h=_)~Cglw59Wq$UQ12R2}QPD!X;YQ7-9&bn=7Glp( zxeJO8&4cMxG~Lh+Qpg;bnU07a7&Pz<%`3e*eD%surY>?p(Pc_Mo{wohDS9e4(QfuQ zvqMl)%%n^rEJfmVC`I>sDi3l0rAHeEo`=A6C+idX7n(1BUvUM};1GT^L){UuZSiwj zv1R*c&q^<4nqnLG5O;t4=Dk+3%RZ87({TX2mQ}Pt7_JS~#&{FOS_SKoq8(hUTE=aqeFT4niOY|B$44xXMIq? zW$0FOS-)-Ol=ZZgYAulvLwODRI52&9B(+~bhVf?;(3AW$Ee&c?h1ghJoJYB)pisWX z<`s+gCy5t4Sq&p0AWj9{`Wwk>9$^16?(?J8GhC*tYuL8lw5J~X&MJZ?u<9U)e-R_y z!|$`5UQ6G%0wBN4w__HGFdKR7@&}hU;~kCVaG7HstsZMD#uUV5U-4+;#A|ZE)Zm*C zv)95I4dLl@VRW@7A2I0X_rga7(JGZ>finPS(E{mPi-+a5Gw!LOz0?#1@i7YY4*M?} zdzFMheP~yOd4TEw)uekKgx1ZuDQMAEI#`%F_Y1#2KP??MqgFF{Qxv{>U8a!20|Ax3 zd}Vc-GVGIU$`8Ru7B=~|;2uFjBWCma9ac$6AIly(de?O!RD61C$r&z7F0Hbz)pI3x zK{29)QVDif$jrC$`8~&%5Ix&&*9@Sgq|LFJG@go^_Zf*7_fmTYSeJ%=7I}u6ljQ!o zhd}HEuRk{`?E&0k;#qiA^uq8x_kDDqGAK5ExWBZIc5_!(0hI1$-#Ye)mI{0PQ+FAUCBLbt5!US+$lsK{yptjJoHKG8Ukw7kiuZo^} zO<~=btGM~f59`1NFd2PG1*4GeJ-6w9!3iVlK|06=>s}jN89`3##k~U&;-5<^ zL>gvx`(Nn1ajXlQIEz_+^WH1$^h)6LNqWZ$jcEpRFYxeO$n7W_wtRe$7v+M0M{ zhPvyftn1=z@Pq$^QNCU1*l_nTW$-%Gp8|66$!iH&=#K+nE|oMY#!6Y-8Qzhfb+is%XZ&IDKQ(z;Me)+yJ_ zA4sb`dru?Nhk-D)KfR*TH9!YF2eML z)!bxAf~!7#Enm~@$Y_7UbUToiw-j8p<*_BHC!@k*P)TrAbcb$I@sE7`A$t5LMi{O~ zV4$((O^5v=!-jZYb;(dcUstx={CZWahv~SQtRP3bN5<2SPf!E#jbH4)Xt!c(vmnB^;PN0 z^_t=yEoPg&s?Bk7So-JPu*9>W%yQ>C(zpwXA;fIDwYGdJFL1C-Oo~43!cvrB)SP%L zEWn7cnmiDYRMZpdCz>%59dU3Us_XG3%zc0pVJH!OH6-ajoCVk)bB=MGc!>)(NKxX~ zE(4d7$ADzy%-X9X__uLGFS>de>BD=V^qP673jl<{KEHZUWBfaWZEO~rRtZzRy)+xrBvW4PD&l{Qp5RG+zrr6*x z@~Qd-_#R17Mo}8;KTGpdZFG-mA=_+Nwq>?6tS}JTw2KA{=AubjzA44XUf506MC7OW zxR@VteHdYV^akLzFpygLLJ=9(RaoAb7`t}N18o zp!do*eeG_m)%x_ERNCwTN?-kD(n2dyo9>i?&;Utnf1kU0-a7Lr zR2eQ>S!0H6gl6+`Jz+m=gw!P0)mgTyfwAjy-6@+^6aWiHJa02#HCtfg3jTZ#MWts^ zi2#-6d3GuRLpT>QZ1bik%zYo;%9_|&E_GS~7gz^jr4SqgfxMQAH9S`KRn8Uc51Z@- z6XA1UI!={X*J+JyylSh(Y${;C=;{vJD^w(9j*LE2|1d9MUuGBrC0^ra$jwo%wZzI2 z-Fzpe%Y}z3KUY%3@-9Vpz37=8Nws<7aK>~Qt`;JQBDoQb#1-%Si-~PaQMuV&u+?TS z4R1ce^v?&Q`Q7)-CI_tj{I8<0y^djy-n-mb^e?=fH~7%p>tJudCv^8+#Xu{fT+JnmecNajLWn$eXNOR8DjWn~FUozecE_ln#UL)6N<=Q66kkh!H;|ERy|5PVl+;B6V$;*xeiV77hosYFFg;xysti;|pjeSN2+CZ5cj8$>8m<4Hvpzj% zE`^HIZcx$~K8Ok?Z}FZj%8b>ltplJ>^gAtDJS_1r55gS5hgL=Verqr{FLbhx`NfDY z87y*7f|W~G;t(n}gSLL+apV?fhs6Hk;Bz6mW+vFil-wuza^3d2W?#}A=t|_mBmyAP z#m#P?`83f<$GGsgG*Z@f#YRpPr4)d8H(Lvy;TfXL#tTOnWfO1v6}XJ$MQ`)Y@=aFy za7GrPzY4GhBB{3I4EaQFSZipWaXlh!7&~{)8k&CuS)6l|)qp4r3$rhp$>bsSKf5jshgCZC z{rr_X_qH(K5mP{zNpR~_(oWTJkrZESp}FX0O1m!9q`B)p*Yr6ok*`IY@zc4SZH)E> z$IOI%q!e@~)_*+hep-Xp$FP#jmzr4?$dK9Z+A5npBjX`rEr^nex~HqGDH_B!!P- zr6k5A+3)!x9yBA#SlpEW)SWO5*OQ)Uk$)r#IsP=1yuivxSytm9^8^4Wdh* zt6j~awnfA%0v-z=cmxTT>AE(jJMkq-=d$bY)d*rq9ArE2sVwr_O2L}jT0qEk@z1M+ zj-TiiY^sYBKF3DRw0rRJ`=8MH^jRVHnp{nPF`)(Er1WIYMQ;gQK6ADuAonrmS!VwrIa-uC5a{IL!)ntdd;^wH8LLY$0nkaqYDSPKo_E}HeX=jJ z&Q8xTUGHU<8cDnha7n=Y9J&jF75h@d<~Gxv!gc`U{9*uC0=Usgt4v*2xFW79X9gQL zd_VZTVew-}03}`T!nURuJB51b=(u)R%xcC1^*W#iR_FnQVFoutjb$Uf%b1itDLwJF z6U;hMWWLlaC4UB|Dz_F`9Hs$n_o?!ZJ+}L-1wI)f`br`R>YsX0(aanxviv`B!`y*b{ze`rWuT`$R`- zMGNE>$0|X|1yL&xIO#d*qP_WO;_`ychNd*gq#tnwi2ZDb$wKj>u*w#q0@jUxCd?xJ2Xeb5oIHg_e8A2Qg*XfjNr=~ZQ?7+rXW z6Ezg57kPrT@&|K${4DCFBnuepHx8|7W!wbsJ`Q~6s(mK&yz~#2oiozJ6e94es#7J?C{uo4qCgMKx3mEVi2g&`iIw05K5ysrr>O|fTtOdOrow1M}mCC59KETT~_5bSm)8twu z#C}+=62OSVXqNx0cjy5Cixy6)U8U_Mje-{GTY%E&UbcdjT+^v@&o{C!5oKo}Kd~)~ z+QD?bjr-44@}fjwf+$AX>iq-d{xhngOK zFy)JV?TXTvvEn^uNA?%>Ex2%z{nh_nqDi+tLU!eK&%+&4@n%+KaNrB7SYN+C*5Qxz ze&^yHwC@omG17RP2iB8iDleKBRW|`r9_>j!n*tz_(LndFnJp=}hcAE$z0>i{3}WO( z@c++BfZl^ zDksr;7&E2!+JQMDq$qNsyUBG@svg2G?7o`>0~-p$!yoW}nAw$Vbn?b{iu$S%^SW~x zF9yOV0Fr`&GfYP_7Oxwa)p%(fx|t20>0>>`iP~`dv3~eIhmI zZw}vRX!<==ND3x76mXH(k`z;(4?GR>HV+qTLHT04g#VBd-}u|&U(*hszPUZVQ-G-u z23nZBm@kyauJWOPrqQQ3U{8_N!?MmMwB7LpY9k-S6{AQ1+YDYF`=0zdPtamuSi2us zPu;H-F`N}pIg3z9-zzBf_zxi$Bi8;-HjotWN&l4roWy%&MGVVwa$%S1Cl_EZ4xSpDuS~bf#Pl9 zRjnUjTr(0#(}2~*BsDYuMswi9lhTM@U4Z4k_$)Qr2~T(Q=6fqsxoTf55_7k1kVfh` zTA1^G?rWFs0~IIW&V|`0S)XByUn0x_4NnI@Rnr2-3#t@z@A)z%CMlRxVRh}ZGv$nH zNF!7KL>z_{ULw%WM;82T_9i}pKuA(Z9CJ4OkQ9)&6Vi92J)`Zve*6JC-yTIs0?%7q1ib%nd|mez!l@9m}Id&o!N7 zSSi6a%A8h0=R2O&2UMg(oT@IgRi`=>e>0#S|DmQy{E@eM?1Idnz3$yH-->#J$-l`v zwN^`UnmgP}mw}a-O%sz$4H3ImkEWztgC#oN7l7B!>yLGy*&X$-(gY@?mn=U04T$v| z9d-S=)B3=}@Ww6S%ADKPtrqM3_>wS_0?h1%=^3fVr$as*ege+M_$9l@B`D}GeP;~w zU}x&v0SEvl0%|sPQd1?McXRdPx2KzdRT+7N^(KAfLisn(16=y1RApeAEkkc!{*S?} z4{uFRjeoxm8@J~c`1wyd#h_T{4IX`JmTk`Os^|H19kx9~lHRt;(hQ*)07QB9ql$Oz zY50b;#DLKpMQ^MyJuA99g*!luM4DZ%O2!ZpL+BX#MdS0`*WD||Ie<{S)%|D8VTKLY zVeJ-gxCcPs_iW( z1;=Yn*x^<1IaPcd{ntnEGq;wx6QC2t4}^rzymu3a={S1J3M{B76_lH4{jlV#iZm*!d&GnJgwvxgP6sVAmy5%<5m5^ozb1+*C>FTh8wTOWndJCJlaxOrztSU7F^{yn+FbUBcl&)^o*K5ecjzR* z>WeVHQ@_(PMowM_Fk1@2B>h#-Ud!iopj@OCu&7$+_%eLE_;2%sKTOgPCi7VcFpm#k z=EjQ#wgZdAsztz!A|(c`hel6{DNM9i-x&K{T$l7uV#w;2^Hg0EcZbMbmHb|Jgfg0P z6!GcK)jYepQY^&Ng&MxqNRB~ZKWiOWZ7WF7-Gm33A{n%zi1i?ZIAeZloo{7%GwSKB zODchpJ4~f44Qd%z;t|=+9ghqGJ(Ozc?K4fByU{5>YU>xZbpUtg;U+$ts*@2a)!4ro z`c_8bYB(xop(S7$bAQ5l;=sgfLczhpwZ!DkjslhzdUo7kyywo@aPi0zB|d#kRZP)* zZ&GC=-upY7r z57Y*|Cy3Ks`p9a`qAx}qOTBx?iJ^HOvjr5JoK#6S@`uu@*}vL^ZSLydeO(rEwJQ=- z^{Z(Ne`=<@_BG=wEJRm{kw5^N&_Iebx%J5cKarQ=j6a9345bDwf}LkwoImOb>VGY2 z-Fk5PU(#Q-zsVB17kj>(#foStrHA(9CO{=Fl-JDuIbH<16#B>O=lkkB9bQ!F(W@VP7Zu!z$}!?SYl!@7 zTdN!Ei6)`&%^uXQ_6ys$ojoBi=Xz@!pr>l!=JwCy-4M62kUzXAzj&whE6aNDi)Mq$ zYYktkiUbelzrReL>7M*|9uH*GV!4vt^AEh#k}Eb=43I90Nf&`4P*gNfJU7^fqP5(d zZ{Hak0s4}T?BkFsfMRulKR_=W)S^9eaVYcp>Eb)#R;D#{F2uJYvc_2x`GvO2bln+XMVgknx+eUKH4&h1A%VD&#pW$dD6fybo4{ z1m9QyBfl}shb&E_73jBa+O?)UbKnD=NKNROo_C{EtyXRMT=tI~R5clP<|S^wQbT{s zP;L@sd&+bbs;{9I^*6i@yA1361hriYeLJ)<)UewueS|(o{d#9sno(7Z97urGY1#Lm z`*Cf_^DHn?qvJu^%C`q?K@*Qw<&R~=D7IBEL6=dv zzRH6gBlCmheBc*fB^10jJUt&;ZoOm{A;6aW6H8n~oabjxoW{e6zC~m2$pH6rO#$KV zcWW8>BQJS5%utx<$~nKk?cCF#lrUgR_xzYMs>2pH3&mpQCvS(ke^D3H zCDj6NYe5aO|BC)r)l8xDx0MerblJ1t7%f>?|paBJZZL%ZlQT{#g*sHon zFAtGiyH_SdG>6}X^Dyn9h0t8QYaDrCw3_Yf91}Lz`TiHkGb>(d0n7iu<&K4he+)l6 zZ!C!4PZhnW^l-6ju`^IQK(!tsh^lL#Pe6XsPC@Y|)0B;pjnxA{@XXP9v;G}u^t870tx$e*X z-cQNP-d8SsNksI!aH@Ci3!(#x`|q9{g)*N&eOqZ!Ye0`)*KOvu5yoh>V98ZE#I3CV z>~+`6!7ol-mW<7Cs_2n4p=>Rzse9$?1B@OLC?a+Dt)wiyND<(&`p~HIqcXH^A6zC# z{$AvSB(~Q-xLLqO(EelcBju<7efq7lC+NeG$;t0Lf7FCYfB!VhS9|Dr+x`2p_rck` z55E5x43(gs3YXu^SU`_bWH%p}&s zvANUg+KI(K4!B5%TjzFuG?`wk?O`|XXa8cl zaofwr5uw^lA@&D1k$a2!VF%f3mqsy|Ce4F!RsUqUfD6vK!B1>^Wl&RcY~dD`%7?8V zL7V#RG(CC6m1_||HTJpk+Tz)Q?3AUA=17p&>*}A2DO#eVaw96sGK}XvN21JN6Bl4d z$|+l?h7WTClN;eE7QIa2_TtT$(B1Hjs~lCdZcO0tySU#k-n){0W6GMO%ng?LFH?kK zodStZO}D9;*n`i`czebVrsf=0zF{XEcJ8ckp|D5GrvOB8&ziVznol+6D9u6kBJ%U( zv^L1g9Ok;a_o7xnb#Cz`U5vx*OxR)O^s~qmT^|rbbDVwTeC4Tn$mbi-hE8%l$bi0N z)kA^G2zFz}5EP%+VvRg}COrplhQ^?P&hIUhrn8?c<7K?te$MANzV{@Vl1JxTf{uj& zZAypexD3`Tu4YXAn>Hx6@{h;g7fyB9JCy--WnssV30=1kZ-fEziTKZW6-b{3H0B?oK#$UWbtHc1O`|9q&+FYUDsp-M=Uo|QjCC$m@HVX^^SPbvyJ`oIse3l!L4fJwvo& zVAJ}O_8wludtUn6|Bc&jubMNoA!7EZRC$_56Pv9w8V2!m7j3=$^MW$y zX;}m>L0=^e&3EJ+rJ~Mjc~@Z*_1pdWdWzHf_=t>|pN%(3F>3p?cuV-T&Ovc;08`>P z&P%Kc{q|<(wh*&%A!IUk;r6Rh^7q`g3M~`ur+^pFaK$bcYWLOg5#>LrFioM#>9&of z`f$aUWj&cgyO|jyKYu9)niL+&TdJzqdqZ+dAoV^U8{l`g4hw-k6pPOzZ=NW-@j>eS zou(6#Jl5}Q4)b#FmC^V$B3gNX26#bxM`jpB7wEOT(EdO>B4FoHa^UXfeOA%6{XZUn z(0NXYr};Q_+J!cWIG%rK-~WMm!_Bg~A1OTjFkUUpB8((yI>3J@4WrquuWbjx5G`|)(>*~sc24|WXb z2FEhS3Wnqozw&U~PHlb|V&puly-|u^ErgoIJQ+AZ2zi<1f*p7^Njb*9()>n64QP*Z zApl{VqC9dt^F>nb5uc*#TTMttux65ea$>RPL+5&nZ#!92pHe~H1s5JQq>7aQQ7OM& z_hMP{6^OJxvg*pka1eLA4CGV@>9bmyOB#*G<16ra`DoS*%hkN>V9vrDbLWzM@f z+CvdjfAl_O_jgKwc(2Pt|Ly3Z)PC6&ft%8l;knXFetwK#SIL4SOXEO+@!Xw1{n?R# zA+-(&v3-F;(E^aI+~#LTfRkbk8|{x)GtGI!7;J8 zV2PCHO8MJQyKXPWiACRD+RVWxQMUpg6!t)j`k&9ns)PAyHKgbxD87w3bpxkL1Do%AL<5gct<-|rQDrbK%5xVi4+6bBhNBS6@ zC(P+k_)f$!_3v4NTGqh62SngD(rP;$ekpEh;Sv$=R=4UKLb_T(Tu52G0^g_hPZF(J z;|4|z>r=XdyNjCP>i4ifm*mrJb{Kyd`Sg9;Y1Q!6<(Ku8g#)H2+nQf=L(x$sh6eFj z_8kkR-WJNK!|p1yPScYIZ{p)Ry^j$;)+Z#+-%`c-E*WFRVqlxxVG25exh(infw(y< zaI{BSsW{U1KOR|Mx~XX6@0Z{-QDrDdQ>BRO>rD!BQN%1rSSEnI%}QdvDEx8JT+dlv z*rZ`H`p8VO*xRjZyRO&#DI1n14vcJ!_{d1K^O&Z;@eVW{Td_xvOl{e*j|?D%O4hJv zz6EIlz3KUdrXnx;uUHt;%l4rZ)0HitEsUEKk1V&gbue)+zCN+|$k3Xdm+IYj1W6ry z-MDr9N7tng%uSmH zUJY|NI)+j5U&c3_FN`is;%HDdx4Q;5Ww`MSe6ymeVs_H>L~4HM!H5;H(<=CDDXLom zbJF&k^Ol{;U93ua5uJR(OVh$^eiib;ZbSdua~;so&pE4YMUy%zBqef2L9vh~i1O+m zi>Q&18cO_02PJhIJ?SpsCW(qr#tL;*5&_$!{m_}S>~Am}vr3PO`Y(pu!!sr(ZvcqG3XH$|@F@?WT!yQb!OWP>3_j?_TD3~tn^4*VuwD_a@ zjVy3Ro{f3WxwIp6d5xC z?Bj{^M@It_zZ!z8DT>gT2j?9wfVCt9FvR{N`5t2{-3uI*>RMPYz0H%|dQc%>}KG(YtC#veexH(B{S9-7P&@V)Y|@*~hWx+wL} z6ZNMI1rrd17Qp>^%tCb9=yiZv`3+RCzUO?NEc&VTI->*N_c3Cvw>shX?iKFezdbjE zGmqs^s2kJipdwPEjQe)ZHgUl}#lVh7tE<7QQ21&?;7`CyqzofTXU1NlPno-I$L<$> z4-h(`L*YX`p+%vH!tL1esds70pl`x2{@z_a_B$h77$ZSiD&ffOgSl`X1=gIATpzGp z{kjfD+fP6iq?&2+uIFc$I9U*HKyz4oTfDJa%6h`SK`kzXv0%}b5MH#=6T6zO!OzO@ zc!Cbho0nw`tb^`Xdcp5E4}u^UJBzbSA0YO%njWW@hS$wcIwm$^2OQN8My$VAD*kUe zu8a%Wv0SU!>f>%mOzj#AI7nTR6||n^)DPI=#_P4v5Zhi)UZZPcYyyA$@eV1gcFIW&XSil#+V(3sdG@e5`O!p>p-~Y-mY+s(B!;|Zu4pY# z8SOtP8|KAwKCIr@11`_btQJ5Zq~3jQJb2p69hk(;nX8)>`fl=36JwS4PKi?rfXe>P zcQ7#&(3ZrOCDdb!YYJyUPP>L{qOg;`r$8)hGg(HAr+@&_U{1?J<#wF8_d1r>#w%fX z?+QJi5d|n2$v&i-Lf9Px7mR4`RCCddn% zX>38JS5#Ben_r1xU3QydZpW|M2cPSL@YU^77XJP{R7A$}qB&&!&Q`zf^O8_BZgH>r z84GbyGgX$@H6W{5-|Pp7p{ifAmMLCd%KJ>s=iLj;*@U$lY!rh{;AAxnV#_dR_S1I5 zaLC@`Rz0~n*q@mhYr(h-_U0vRXksy~l*o55ttm>(mDjYUi*vv!Jf}nT0q4~ScB~&~ zP-q>HiBOoPAp+oo2@^Na3lqyoiH<^!G0?ZNP_%arlaBWiz;HM&yP302!ZDKT}V!`c5VravA(ph86Q;+mPuW=&wjAip&ilNL28> zCRyHdO$HXm3OWP~&QN{T(09l9Y1<`Wc=F;y7_k^I2$)HG3sqdNCYq3xCnIf8FjTop zZ@1I=g+-dXnL4zTodFNqYW7hD(OG6P1`E8G1vNeqt)Qb0_?sJFE0~wMmOP|1HyTw2GdjhD~1tIr!#Kg=ga{44iWSBsKVym>H8 z7z6c;$5;~#eaAx^m5aeh6S$8~S1eRU!kb;+oT4ib^V#OV)e{@EQd%Hdg6vY!45KM{ z=0Mq)pIeIUXA2T$>9;8LL!q-4&D+qU6v!I)Pjgmu-|iNuHCjVDF1R2*XU6diFFFA6p^r-_t#=KEuP9qi#qpU_tNXwbgne^r4z*^ST2NgTF;Mbe+N2`3tvMWx zaNYI=^s|0Km+_qqCEO-@5@1B#VT3&WdF(1;c060YI-~{Bja$B$R9T3%xq52xV805^ ziIA2LA?YYNL2$Kd*Y7nD@q!b>go$&%tq$m_Zox1e5MswLU{84kMx5m8hmbN?WSHJXW8ZcSHhTw=@4(Q_vtp-uRtBe+35g3TY;4#kYj0(m@QWOx2 z%6Ca@2q#b|GFx^_uy(fW%?)wi|59}CGND0BFF8SU zieu}*kZJzdOJF9hzdVcx1lk4MlEpRSKdp=N*6%sMK+%-JJ(0mZZAL$&Xi%&yB`BDg zXxYZoD0ZlA?e~+TqVy6<6Y$cFCQyNbz;?qZWiSK!`zj)&X6v-z!$%gpjSOaZ@v}-a z<(;}n)smcbGE?12P)O^Q>Eq z=T^DgWn1zNbamYj(!V);qjQh@lz+)X#Z*W7uA1(_zIC%Ft|fu<)zbaS(!3cpb(Lj* z&3gCj)!j8|QFC~WA$jA@J(Gg#6`2@vJAPz{6nmyZ?@}4l@|OlgLwwE0QQ9T1Ue^%w z@IedWa>t-zD1@PVDQDRs^Iv_q6{Ux67!p@};vcs;=qBz~7H6=h{`HSj6R&QqR2#yx zHu#8&qgrjwEEYsGFIP5tk$QH?>soFj~t$557zm)8hZ0ez#CO&Um(MBxllAW_q3Dixoiou7Ns`!)R->FV z;cSf=)X*k35j`52?=H$0Y%x*2@Amk69Q%inxQxo)Wn7G1)#eNHK%tH$_i>Vu@8?0t zw$=-HS>(TWrxa#7&Y(A3%w}Yt;)`{GktF)qa#rzU0OvY*qT9j87mMsrY3^WzQ`V*~ zb$teL(ezg+*3s@Sd)q2(#Di|edb~u-JCH0FK>qBZF?Ru<;isFbH@lzncF~FEn+T+A z)PW%O$as{&F_Z$rq^Icxmg9Kl9g`8<=q0@LGJUKm#7{XB^ox?+U zrzzpIXKujCJ>dq1XMc(xR?7UjY8b}*?;5Yi5U!X8P^I6(o(*!|%=!F9(~EHSNbo9F zX2n)QgO23!;KZG;Gz5v*f@v|4Lg2g%4|) zYv8u`2lgmTh2C!6!T=B%#2F>t&|w*5yXgzJ>=F_WtGos~yWmw>(6nOdkk}vJDpXqg zYGWo_gV+{f)4#Ip8zF>5NJGoGO3V1QFv$yw1lvx?e#vtDI2Yh`=SFv$NU&Dv ztVsFJmhw;0r=_Y_Y>z`3P5Q56yF(*?lNmU8I6yk~>0eobCvgIoe;gL&9F;h_ogm5Q zi9>7b+;?wz3yski!%C26gQ8l&LQv1?#k*er<*Lx*BkG3cT< zsLs`Q?7GAYga)o>w>$>)(EZv>F4!Nyi#5dL7cl93&`i=*Z53|{C+Dkg1c2?gjp7axWtuLnuF4+&m*N)#U0%FFKL%I?uHmVa61}DOR6{L%*`t3AXC-|qma-qk9#QQdS?tJh7KcOuza!{8{c4f?d z{O+C~iu3L%1Z)1t&ZfQO^YY7#-3!{DA1FxSmTHOAOwwnM~&>?DjW*X2ymYW;NBZfE^D#Z5w>1kS#-`~ijUUM$R?tFhx2Z2@L9 zJM^E;XMtDq*%YgSkKmO0;>fV~r-=RF3)bXuMWmW5O)hzo&J9Htw89Cl-(bd*i8`;W-BJ|Sglu2uMP;+%$kjHb=b{O})IRj}zXnag z{-jo{1=r;*TMviCDLE|q(WcQlfzhO}^mI*a@gNj?;Jv`}#FHT8$y^&u*OTGKxf}Y} z?S%Ngki2d=!2BjS0sbA*85FaM|2fV`GPM*(mZDZ(lTmo;)v`t(Vh%GZF9JyY@Ue^0S=Trs)j_%Zj*`s*drvkx!JQ%9;Sg{sbB8xwsy( z=$NyYzS?Qn2w+m{qBOX_uzxgKsrB@;rX-AE)OK(m6vrt0Hd+(%~6IhXzbYOe74Gx(UqNS!1MXmV<`s z3z(iLU-RtmEZ_HA*vw*;SUHF?gCIe@R?!xuDl)EC-5iPtX58VE^85>qhC$qiqMPUo zZ-Ljnl?PJmImIV#@?0?4f*|yE@>fyA{+EL&Kf@oOctf>cqNMK8t|Gt?Gt2Nc^)niP zY8$etd*ahma4GTrW`w1d9OJ9>z|45RQ1m-C^MsB+2bY|Gb+JVcGr(7}45J3!qxWTY z7>>lHF!i9vnO)MJcOLq9u$LidLCAZG{#OcqZ<)~>iX&(08&q7c&0HW&_r{M@3Nniz zkE#&Qyd8q zgFU*J06z4p=@3&4YN`)v%7Se$>)Jl`+1Wh3W5(8XZB2;aeAh>|OJ|5Boj!67nRCXY z^l`f-uEjE9+nmCdX(*O9?Wa#hV??($tT@Fk;>7@Q##t=ASE7_T( z3xFb>LG;89(JWi}A-3uCT$<^T2By;C&xEuMuFzTNe-ARW1S%=6qOhtCW9KJtVaHl7 zzgl<62D`V|6H+4@`;<=XG*dVx|95qUpAs6D$B3CU=44R1ujH*vNYZ@aK;vDlPQTVm zKERQ~7VAyEgad;lYOa+2I5<;0Mb7%XtjCcx}w5aZNDzPe-O~T znQqLXKd7XAm+{NImDW{I#HhY(8o&jRz;``ewYb~_ zmIP+=aKw$SqE-p~J^Jc@7NJvvAksZ3a$G21Zc1k}()Zl=D-Wd!4X7|Q7YaI0t<2jM zMiTC6buwva1Z^>Z*kgBF9c@Q^HUS)_j%ECueXyJE*LTR*6q4_{@8K6?^9ixvV1bt3 z1OT#0Ka(Pg6=PHY0?0iL>}i8Fy&Ka{z2&upho8)MKk0TNlL-IPr(n)oFNkX}(i#Ar z1Zcu%T=+n=Pv6BSaU+_VCk(cPJ+@#^&uVcT>q<4lQoNSt%s2ZFPa0#6^ev*oi-yU> zVOaNQC}jCTE?wR43i`N6YU`3~>gx`do{H~lVh~GoR{j%XFCzfO{K8l6lm8`rui-nO z^hB+C#Q7h@`K#TufSZOKj<(9nBOC9hraMJq!O@9`;V#BLFAUV(Q%LG)vNsCU9T;Wd zu>L-PfccVuns)NLM4EsdasuuT@@5WcGXxL@bj^8OGdo@4kx;YtKcW6giO}G}#!Wsd zorAPWR#DcNk?f=~Z)Rh891|kp2%45lr z1B~eUP*>UGSWooe?0C%e?w?+$ApYoHW6B+dZv1OEI{2QduDmf9&kd#Y-+#QE;}Z2# zIJ z>}kZ^XJ9P0jI*c%LhI99$ki-Ke+YE!tAg$5!YGja?<>`3djH()OO!ZLT?=KE{=wJv zg_HJ97{b*`P1x>+Qgip4g6hg+MA1MIKSQXWSc~k98_&A>el!P4|COE_`p1L#}uYqDRY$e*N|n>$EfU|M;3R`B(7KhidFQTuEX%s zAopY*V1K|zzh#Ga|KmpaUR_w?P`RJ>0RvnLJ=i{uE05aAkMdY}D3mo4+d)0twU+3` zg8d0?c|(IJdA=IsyCXJTNKsBrWHzAuteUBePgddq&BO~Zxl_UWONt}k-(gFS|6@<7 z@w47-WF0Cc4&nO2iR^5f01{a4uv0Fchn%M)u`r4nzzzu98RXqedcDK#-UbAlX9cmB z&p|GK`7Bfyi@aF2+i;PR>79RGVsz4*M0MEsQV?7+Q!TzPhW~=UWyrQ(nMfJd(Us2H z7D1j5JN>i&1-#|D>3x(QRQbs8o?P8DK-KgNa=HKdS-7C{ZJ{ z{seP1S1)^}_n!t@J4UxN) zrGDYT-EqX!J0KC5d*bt15I=YjX=+yVWi$!}`zYy<=3R5rdeQ=Wj?LM6fiXSWS*uy( zuPW17TI66NFU$M3dA^8|{lJwIv2EE9>?`vGgtxf`WTqz!=|$_2DtwN?JNEkr!(G4r zdQic`L#IHGv_~EpWET3B`Omk7BJ2s>3ShISdqbQ-M;m{iDc2;MUJ1|*BYQzkyqG?y zPJTz#R$Tzz>!}c;P=Uub#u(mp1)h};5d&QWTyp2?`QYs^_w1a3C4sWDR0JWl-aOFi zFpq6F1kP|2E#eHS+XLKaK2#3aW%gG*@|52*Q83y)%@jni*^jKPZ4|GA$hZ8)u9MyN zJ%^~>NPRkO;le$z)33qC32E)AzF}MjXMw7PHDT14L%OA zVjoP+M8rTaTI_bm)B_*^4K@cRDFI)bz=bz@5Jd|h$#SR4RtQM3YbuW43c~FPzl^1Q9M|od_Zx*J!uc_ALOpO zDokYVKPi$26@Z{Dx}!T=TAih)z413`9beRsJq0o^lbZUtTL(QBPp9Td z?x5^BSh8bj@d%BfLx?f}$AuhmnvJ)BkqPd{D~_RU{S6OLyY=q=jN-`Fyy!rMXyzce z?mH{EEQnQDaQK?^;ssgK!1LC#V~R&2zfX5h(^FgkM4M*r1Ge;!=W%oB59Mc#^eDJHcu|5|x+Mpa@e;fR$i#WVot)n-Hquk%R+$gzdlKUen|JE=&@ z7^rhcYAVDW4glIi6!`Lf-k2xt9a>@>XYya>-sg3oz64{y7J`ywGhPYr7DdW}l41s+ zn3K_zpU<{Lp)2;Ee$q8ku9zh&#emB9Zgd+fE4|v4!Te#FG%*G>GKFR>IqvsyDPs$> zM-o*okXb?XfA7_>F8E;Twevkl~fSt0PTuDloA(Z1kDFn7G%cIp-7$-A|eh_0MPO zL+0vhar_6M>BgwN2|-N#ygJ4}&1g1*0`6U#o!KxGhW5M7O~u9y09D~8b7&*+ei#qr zQu4Kk>^ZAom+%}<_NV`j{z^KftF-y;TN(_z?wBxms_%KksZ1m`etgjoH%A7lfs{&= z$xeRP;`ad>2Tnbq?9KEmcKj{4FKj$vO~VF9;49Q#V5MRLtUsn0YK3D z-4?@Jg`;-|%3AltT3Cpu(jq?;KU^ZYxV;sY@LKovVez~&%!Rq~ZR^gbw6p{qhjEO( zk%R1${HX(-^b1^f$*y$vyQffl|KsYM5D+36x;Ggf<7`n;2Z`FV7WTQ#SRjtuoLYE$ zwjQIl^9d%n2{0hw4-A z6#?S&qs3G%zzqb-h6Jd%B}4TdHpUulUqHt`!|{T3msm?zI~Ex0B>|hmj2|4x`6fb> zv!tyq!L5riaV6t#=K<6{tou1e98(^ndOEUIfZVZ{QW4UM`B;|T9H5|T2vxn7@s1I= z=QNiM{mO_JaY{?yY7$vL&gq{VB!aGvMe2c9|M&o6u{JK6UsHiP>75+v8i#FvBrg%G zUwqY5E03kN?d_4%HZw|ZN)>W?PMaAhUtH8QQ1p}B8D+&QqH#cL0hfjisi#b7t{)`*H#WBPE&#zz* z7O{KTbiQ7sA!X2qOuE3IJRoSfsHUiKCbyFqwvb7sUkv%Zsmd-%DMr^nLQ=Us!N*po zF^YcRNM53e(yr(BD*YW?Mzi>j&3EIeEs!9cCzQL|h(qn1^e-8d*grA8c+Iu=qbtO& zs}%74h#XlWBc7eYMh0bF`nK@pf2#HE`({_*wZTpO2VL~O-z9GcvVPyG-htwMqLm8C)kf!rqWKAeq z{C#@#`%<2@_y_ztou|lf=jjs|GtWe9tVAU-B~V%H$>m?v?qk+uyjzC zk313?1vqx=G^Bw$&Z^BWnne+)*=q~wE|swW^9=OTeH9-)jE}Bs49zL=?s&s(6aYr} z;iQ;?s1bIOQmA3vLBSdd2gOEOy$*p}y^mdGIxl#An@8&wYR8NkN%0N*c(L^e&y*cnoV0+vw8E@(S6nMyl&*ej7bNe6T-!(rpUPqW>4Z_>M^XU%JEMYm zLq?sW|Fl)}SW=bjahFKKFP!oR)HP<)B=Nkyyr$^34}~{*poPwqNad%k9nk1<>dZM{ zRnC(!3Q}a^yL6>j&r9~Omgg@R6!xx6e5TeiHX{Kk3%a4#kc0m%RJXF(@#3BEYa>RS znMie*R^VMRud!U$A)1Y~(=bT&6MsVt)Kpg^ZS}(#64a5B7_ODhtr3f)w zOz;V!7Oqwk0Wf_1l!A-N-V>Dp+ZQNSW#|VEehVY#nAJt1hO#vY9X*>!R`o_MOUJ{&flK1=h<33I8677Ah zU6JZ>2TF`iTng3q0gjJKAa`*@=v8}GLkDw56?@-r#}{R&b}Yr1Mz$U^Iv+i$A_pLzI*@s1IEnrTOnEH|G<}(InFEC54Cy&#y5C-)H`dVMP|>)(^?qo6<1+w0 zn4HE1AWoN=1E`2b#$%t^it&v{Kna`jrXo)|e9ZTOHdP4h5xbb)9wpqOKna8lx#iR= zf8?za5YFpioN4s>~{5;d;@Xqaq142>MKTf+n<7~9btz*m;s6S?5rF;0LX(_@j zU#v2wFS0$KoX;&eBTt=H*MvUb(Zyswt}nRur5s=@84m78DdLDukSY~Rc)w%(|c z9#_VP>Gk(8K3|Uz#23D}M!=6;6La0pVa$SO`4PtLu%BUL51B|)8=JZk<{;E?i^Gb=RTMKAF}rjhx0O98Qsr6%0|qWo5l@LcKU6 z6L1ess*F#UhW3?}<|lWh&c7qQe+QY6+=6`^Iq6b;&6E>E>&fT~2||}r@SF)#0%G@G zdMr%HwL=bq9R#3xJua?8GXX1zj{@bRkGUqHeX1!(?zYr!oGJoL%3Nk?zkn{PkMT&! z503Pu_jljN$L{~?kIJ6BJ9WIj%3i2cdqnSb=wgC*qaQIIa|=bJ9^AaEnq;c9fsM_DG3DKw$uvT3n%cDxp}DD*5-Gh8 zR2NBf)aqN^1h1pK{&Vbi$QX+fCxSuiTz$ueQStbnd;2_uuU1crSl% z+fDfwUDv1J76;+|w!8^%6Z>_VQ>_Iqld9n9mwr?WPm7u6xP69j8OKR5!c$AH@@DaB zw=pk1spZQ~#ogCtdt6qJtNY@igD~81V8(q;%oo#rTbITsMwUxrccijkDrmj7H2^Ln z1K4*J@G3L_#r7P38~w4iSvyQR&UlOOTXUL;)=}@yl?(uF=Ul^GEp8T{s{{aE`r7_{ z_oS~YDJTQBdb}jUpc+Stt3wl6{y6vPB5ju9Np^Ab1u)EQwd4xB**)ls{PB?D@^@C9 z5mq>^03S;DeE+Y?>KE^`0R~N+bfn|okrxi(?EuoraoU9s014+0EQD4``~)Mml)U}L z4m2?eyX>GKUbl^8HoV*qFOx9HDog&!=%l0x!(14I*xN7KBB?lM zsb7&}`drZb8Yivs2J6R&;;l!Hy_b5*EeDdpKfH0vhFaM7!(gr%`~$t--7KqsVXQ@ZC_CgfFrpL zW(E165`56|c7Rf=F!s0IYL%fUBS-%bZWusNaW+5YE-dM7GD(lg_X!)th8~1CmbpWDFDRK~4FIw3qU1n;UUarNP+6e)XW`4u2f8y&GCRFu z3%9)+63D_{CvFch!>k+WLZ_i83qa@67cvu+%zi0*L8? zi{LMWJS%mosW3FFO~6l3S-@9bM)pnW$6@F;aWQdi%OJ{I%c9+VWp^`VetHTY+<()e z(P&E$)AOexioRt8LLg4w9wP!2^l`*O1D$*7?=MMyro<-dN_hDP>CZHEDzB_&hW->t zR%qSIt0pEX+1}25V)`$(S-IZ;pveIAZ7@>u32@NC>PDCArUR_J*fkdj$A3DhK{X_R zS1s~)y*Ou?PabAp z_Jp^FcDtq6^#Srzjyl4q%gnl&p$Aw!{Zsiwhv&7^eLk*fq`PhWC!JrEDtpwM309y1 zxP#8PFE|~6-V|{ zAb@?Hwb@ID50LY^JDCa|1BkHqwE<@ShMpf6_?Pt4)#<;AG=0sdTP3o2pUdg+4}%1; zLggZM@C$TR^0JyeU6#(1RiL!WD~mjUEGKhya{F@WO^}iP1^G@!<4a#rO;Khs7}3Xm zDw_fYU^#~4d{Kb2$df|2;cLtQbN*!Nj;dg_1OT`Ea#5lLAQDp=Jj@^_)~c3vJyx!V z)V!8%;s8D}_lOfF!)3u&?yuwYAjc&89Lf3YPI+if?91%EUO>m4afxWk76!!&#x?^S z!t-sEjWKOU2_*y|ooy~^BE}lyN%>Z2hj6rp zypagAEANE9Fz_AzDI_2*ogLj%QXkx$+1r60-qsf_tuU9{%7s0U)uWc728qvFr2jM+OAL-1ca8k?0*(!( z$2k|vYId!qMosx1J18Diq!tay>%A_2LRv9y|LI~bU{lWeSOwD1x8oB6NE;Uw5c_6%G0(iaX`0xftsyFAgOe%2trUCc=^=VMS=Z8wdamW=sw zC*-ZlT^paF<7khSla%r3q%cwT%LD}JAP4cgl^+q8SKySE^j&y)p$92}FS7j$i?>=I ziHZLBBvQFMU_IAsP4{LZG`*!xj(Lc9RE{_o;Le!OB$U#9TPoOb3o38(G{@4F+eMkL zr0#Cy&$3E39Hy{8_8SgwS>t$;w)ISCW=_^w01}+D<73XJ)|)e+Qw57BXC4S$pYl^i z0}Xhm9S?C8Y}l#QOPns2OYjG$&J%s-wA(EuK4-5)7RumY_0a;zqTe)>AW#@5fi{Y0 zILbjQHaKlL@sX$&Q`a>qB66i^VX`~j9Gfw{BHHWgIO+SilwN#R?%w1oxzBCs> zSr@eZ+p*m3%Wq4)!~~;^^N2|$^OZkJ>)%H!W}>Ry;>mJ2p)*#3CQN$TzVDD*KFH1G z_Rgg2rmL3^e@C6hR%`<-c$rfw+#aB-2D$AkrP0BMm=cF7R@_yH)5SeGRoVcwca%C`d8KgAQ>1dy)U zE83*D)$eVAW*x$%2uR?dR<2f?IyA%j7`9Tru<~Zy7m9vDnq`+iTQDxaHm$THT^S-Y z=a_Ma9s7uMa&ouXy2A))&Hq{|!mOXQGy??Q(!c_h(iu(H{!XnX{P@jK&b+t2I#B{w z&4#Ont`AF-XQv)d_fv=jb+&mMw{JPZtd*ILMRAF2k~7{8!0>tB@>KAPd$S$ry&Hg* z9cWsjxPAMf2yGC;u)Ap8w%bhV#naJ``5Q7gG(W-zg&u?F7dK|9`0S~O3-n(ddbs}U zsCL1;n$h3n_!OuB3x7Z!wDgLxb5RI#8^4|96-DfwEO66axlP`DwyCjizT#N!>RG2S zvt#duQJwBrPjCzuym)fPX2rn39=(Z+CLSya3F!w-yEG|F_d@KmeCGKfL3+6H>Nw@9 zRba?T&F!vRr_WdH)Y|LpOmg(@te-x0ULK7hdW9vGbc6U<7Ti5=iQ`lnsI%MUab9Z& z-?^(9srmhair)308Ic@Hm75+>MEZeH!{NI+Rp%C`zC4$A)ZMk{z4{7Hj;W20Pq(1R zQ)v@@!es6uCt=;!X?>U}>zYlIa#cJeAlbViKBwjL*_0)D*piblQ|$cWbjbJ5Fyd?u zt#1g~ONL!fhcl)QRZuShVWeFba;+A8%uc9RLg2(;D~?ji3GvN$H-~^J;A6{Y1a)e~ zWGB*nC1?EGjskS^)V{7FTEzQ+#_T6-ivxR!*sqz(wi;4b4=- z4IkK?4w~k~=YYopQkKpa4l$}%ZxZ^s?$qsHZZ3_#iJf2irI*-V^+yYSy!D+sOGP(O zfNai21b(l8bCC&3hz}V`XpzTte7Q5&me9QQ;3{Gc=w>-Ro$l*m`O~bAXNrpjuFGua z9{4&RMiU*)&kIgsh_kAz6H|wwlTh=ONKN?e7EuHex$7sa>UNvsoGDop_8-Yt8 zy9aeChC;d42MnLJ)1F;8Lp?YC{Z8XYtY-`IyAJ0f;}N2RrZ8vZs2t8C@QP2(=a_R!g?gB>t_GqewiK+e(JZ&iWJrt1IB+=-DMlw>43j`} zzO3Uf(o3}g0ua}Dh*HG?Wz&KRh50NKXTiRd0;RnZNNQ4p^nUOK)%yU??Et=t!p3Zq zv`b%3nzcwnYO9`8b1`aT((yrkUt)~dx~KV(@3R@_6 zQb9g}%ynm}c=Q58l=q{&g2`gVDZWl))*{4a+=tW}pR;KA=k8_+&|hIU!N36>c_JeZ;)#2?sb~8creP`Cg<8Tx{k*DZNjcZiy`06?ssmru5H<8NTqEF zoB__S)f0ZxUjWjg)+!?XzSkN)9%Rn_?Hw#rUeQa&l^fCa)q1n}LO8`wtSf zkWsmtLd8^Y{gbstwy6wJS1px$gY^lcm;SvV;dh!OLc}^hmba!@bHc#mO65f z7{P!`wMCOuI#}=|1JPDQ2RvE9Pd3b4;s4fV(Yt$e|rKIS;;%^O$&ZpMzU`LQ_Ccs z{OX z0-C896`42m;T0p~%!naTWb z^;Bbnw=B4q1`3<86$MYsGxQRxp!m1&;y;t|3@+NYcRtdUlNY9|XLLiBL_0)6Hg*|D zci;NFZ!vi4)Aos&(NYpWv1a!{w@fafba3i%yZ+NadDrM%s|#!ZwU0op%xqp z77xCunU(Q5DdHUPaW|`HEKuBT5V|w7cDP2&n+o6~5B};c_#?5aP4d=XoCsf3z;O;p z3p{;n1Of^FeDdi2OYH9nxJmfmDW#pXmi7q4_P~~Os>Xu~sdoMsfjR!+-?`&6TD}}~ zv>!dGL))RpNSuUXnu|B-O0zj=Svw=^+%bDUa8@jRGaC5LpCLg?sU?IZ2*@ zrCy(r_xlMpqBfeOLCXSz8JE6rA2(K3fD?eujb_y0dy`lZlOkg#KahIf!!8Md4Wd_B`I>s-y|nVD9R3^X5}s@0#Q zY?VG}z00=%%)Y~xhD>N1y+nTON<ujjU|eDktzbU85Z;gxLAndT&v#%G4xO9M}O_Z*%u z2JJQyE;j(LfTBsc-BO5l+`Od+IYTFMq%B`ezpXH%fYUuor1Sb~lcPyW-$mVl(z=9s zSEu&mwCKMA#!z7k&k4n)v_9s7>++6M&KbZko+K3B&2o{mI2?LxlQ3vg(g({ra4iq) zk{4d!M@I82RlkpUuYfa0O{~4W+xzm(K@3s)-42VETB{J$p%Q3FVT*qA@s~U7H-|ew zI{LT2G@hK7#zPvCH%lS)j|<3-8B6*lA-6MR=#=yP!im36ho)F7>OeMOvO#*UcE2a; z=4Z6v8_mBOpi8nZVvwJ#iuSAOXjHD6>8IG_5*L!(i6P3z+n3wvsRqqFs+-xi2VFMl z<|j`nvA(IB_=LJKNdVr&I}e$+X*xxDMg+G}#-dGD`4F44q0oA&k}>%DF|B!q#AEj? z0cjU6&!L1c3o2lv^yTIH#1OXkBBT!QFD9ZkrOa+l)PW5`GTG$=st?cQa5;7QWxh_; zde1XjUU9?_ZA4wF={OmJQc2szTq;DkcED$i|v_h{f=W4A=@A zK?TuwjMxkjKn7`7K^u*=O%!I`j;plVEvw55c)aVhs;DNqC61WnR7s@JI9b9T@& zQ+4O};r{}>_fe+M7l7iU47_b5F!SsgL^3FBW4YmTi~W|Y#5 z9FjZLJ&1xmp(*QTP2i9=q!#j?k(!%i!`sWscgP*orXMg)JsYfh)&i1kuo30Nx_iN) z+II-OkV^l0JqAsZ%v}2EI50(2r#g>4R3Klyd>Jc_Lry96AZf1?dK;9gAFu2+x$*S1 zsX5zsjAbmbW2cnjA^FA*!fvhK&*dfLFg|d+^05{?9x?0kw_2{sbtbkZuprMSd8I0~ zHhR!<2c76V#!|MgvjVgRa#K7@VfEDFe|=jG!0Z=Y-JZ>7&T#a4uNkVB6dM8aQ%*}k z+*80N475H-B#nU3ox~S=Vowa$3}xYIMxZNi<(m$8t?6 zX;CuQ(sIet$b~TlOiFWu%F49eG~@-T}}cTi)onpy{JiJiVy}& zgAU*LYEu}cwizQyI(e_wHqR{j)S*;n|+gh&f$uegfpLOG%W z;g|UK@i%>ri#(YpdjF8W??APeXMmY_N^cihhUu*Dfamu}1ORT5Odmq9L`)5-e2?ky zMVqDW09#v7CUoX%cN>r{QZgUohN_i;J=|+!U1214BEP{g3lg2Z4LPOuMH{@2w#jH~ z3c{2pCG>%H(;OX99eg@_Gs-5`l*01Pd;a#oigkIlQ2+c_QTsj<1gm|Q^aw(%bbo5! z5jIvG!3gUha%fRs0>vI=UZU!L_We7q!#QuZ0po5NR zrKZv@GpG$L7d1p8E_rDfCMjBpRUQH@VRtiy^?|8%xgn@%;X~Vr%-qo)P*%)UV~f|* zkpwAH9SPnEN(z-8P-D)2|DvbD*h#iHBRzdlU!VbtXi6NUt~$!>JyRi> zi^_xOT=a%g3JXLY+uACbG2Fykyto^$`O^>Y(R&uNA-z@MFt&X%KAP+y>Glo4xyARP z!3oaQzc4!0cQ(0kpyfjmEfy|Z3(EWuej#YDS&c((S6IJC(;khk69xl%$pH9H?S0*T z=Qh_!EPrb4>YKMbHXnPNG9(}8ZO=XE$W;hzZ#PHR}3gcVk49r)b|6)&8e#CVwOro1syS za_8Bpf5>@o(NIzfOqBQ_4<{)d1UxTKkT=Dj7tKSHNP@%`=Qk}JrB@I|Co@ zY+7D47CGd~v-ih+c(YyVeOi%+*)6_jtqAf1hzLo@c!ckETx8SrYMAc6>M!n2m9??+ zT1l(@_bJS+%vNq1*ZZf7Jkrf08(jXlvp@ZPs5Cy_Dazwy0Ji@)P1M@^Z#MKZ>SNk` zGLjG@II6z*sLM$qqF%^Fkh#sshHRd#89&V>vf)4ECh*SDcPetra zNI&1$M1+@pp1{(*#kYTX!id>qo>X%6XbXxIg^yl{9~X8v2XVvtZ5hdMV)G*ITxHtp zeq9X!?TnoWtc>OYpuX;{ljK)csb-C~p@=MK$Z>I(5T*Tw!m=7XrQb6yWPha(ExuYo zCn3(ZVI}jXoB7nMvA;dP&;Qmt*hK~cmp59c{zRqaIt?U64Dc`fvLo)PWanbxn-V_CRsMb7y%nlv__kbo$>9Ix+NyDzk1zOoOa5uyE766~ zZe78V{Zmn0v2f2t?cJ#Sc<|1I4Q2eX@PP2|P^W!dYugS*6JIlRqbZH#&-;oP~(I4<$4-nqo8pfGR;V&lGS=E8=J!4{^6AF1W*KG zQP>?eb?MwvG^j>QjH!-mrF(IleIHdKLd5*+g>ckH03 z{CKQsq#NPaQj39AvgKdq@6%F!wR7c)Nt03dO~G~Oy1sm zO1<4<%Ld#)7ij8tc09k=N!a(7Z&n18|6WEPizbt>5`;dKTjf11x>g#xN0>E}vo3&q z8q{l{eU*pa?{NvB<9O^0ND%m8ZkCp=#rd&?IwZtY(@BMMUnA%K|IkBzgcMM)i~S`w zxn}SYE9^{LE`k*BlvREos=2w zIM3y-UF&e}zNcF|kCViL(~S02dT|dz7JPB|KjrjOyFSBd2ESKsQZWtxI&E|zj8Fa2 zu}uH)(E?M6^aOu|PQ~J*1I+#0&lTOS9$C2ZB{3P3Y3~@CnW^0!#$02C_g1D9T8x+w z)pI;D4p2x7G(YU(Jh#8%sPjx5GbXpTr@19Du%f#w%(fp;$}J_Vf0;(^gw-!!`?3HL zUF)Tpem*<1pWGa>=i>5t4C#usPPN7**DCoZ@Z(c zNnmPtMNvQNi(YutPWUe0?NmbcPcQf~lt!7!;%OIhHw4AEkk}5n*S_Tgz?*}W6j`{d zC1!}4Kb^Vt^6BU;ykooGd35g(o3QnNK@tiw1NuFdH_qePZRE;^iF21Pfv#`*Fm!K} zv0_QSjLdS0{Unl`8dF`p#$VcQUT<52ehOs8Sks&jf{cA7)IyU*QO7Qhf0`NxM6!8=IV3?(GqkKdL^jXf}e`ILCHz|1XJLGu7`zb z>;1`ZA&FD}@raIp)MN+@r zh3Ej16Jv-ZSn}p9C{*I)a|e>`_i_OmbM5FAx-&jOyYTncAu-FycKuv8q4?RN2(xm7 z%Kh)D0{+(*?Zq>=jPhz&oQqw#WIQJkl(sw2P{lpTu1Rx287Qe@s9$gNHbvR+XI#*5 z;%wcE%@nXYFhoL$M7PovtgWqC5waPhQy8EXEGV;9bh=Hg;f8U+r3ivDxuPPbr*p;b zl^ixk@w19lx_dpg%~i$q3*&Z^C#m#_s)+J5Cv?d)C3F90yB^HJH|3VFSX;}=IH%ya zR%Y1}*p8A)W)m?B3Y&W5b4e#TePWw0)7^IUwUIcdR0AuYyb@%^ zzu4yh^y9@a3Mq{e=&OJi?b{pWs@SSh9UA<~Ws$_!8akyms}Eek5oRcsD$Q&qBK?3` z_>Nw>&|BHxB%WJ5s@~kmEl)F4krH4;WWzfJj||foa6bU85_g2e_DG!YsjG&G?AHOB z(?xC^Sf1fg0Bt*M+Une>bm%4a0;iOniQtM(gxT8WjToOc^i&#MG zcvee#_qGoC;#jI>d$Afr3a_{hP0jtfV%0Eby6=$x%yqL{Z79SHxx0oWHhXTsJ%2Vk z>a-Et-4@wc7{BQ+mtRN341GV7n?9R<-c4(-U^-7FK9~{gK`Zyu+V4P2@1sCdK(#Nk zrYtBAl9b_sX*VHFwq4K>tc2sKd$b&sYUT{ z2UXSY+!IVAcFe+8vu{9rpYXw{xw~MiNOY^czgPoCn0lQNH!h_{blKoZ)1Bxgh5LIfs~Ffi?|z8-Zt$`>`QK@uo1EX+>WL!h;? zJV>udrNc4Q7w9rWRr!)j-!mPKl^;#|kehR@icR)-_j!MsbEMHpb zf1(PXLu~DpZYoI^lGwiKKQC;bL>2-}s_g(X2#Mz+ybQgwg&mEG(L!UO%x(dBY|R<+F%El4GV$G$Ef& z;$Vn#pLtuI4gYmIcWO7#LDm>N>!Z)s&VrgNisA*KVtq4Lw+ zNZI;QR#}>8zsj~86g@+>vmm$1KS&@~5sz){yH;ANng{^(4yY|X5sWZ+Y?gADB)@ups(HN=@P3X> zfFh83^zWhS-tFXEUJ^V`agCN(e3=+gB;S4Ol;t1ACyc&=9lnfXOO>A3;8;`O3>Tk} zBz@UAaBsM1{)yZXzcyvpwGLjXKS}7_@LE>iuUtbHQq5W_N#=f$hkbmuR@>Xb=Lwv^g`|i z-DO&r|6P+9Ji`qOU`)%bGlq3Y;wA-|RR*AEte_W8%bT3wFg{2%(UMZRcI^5$?Cq;p zpve-ycT?L;fhs#W@1&>(Yct2JeN#MrIpi-qRb+m{*;XOC-elB;GS_i@o`S;%OM)~8 zDm0}_HF`)bvA}Zxkr9-E3P}3WLH{z(CTaAzobf+~@c8j@dZe=kq8H5);E_Mz>D1u4 zSEpE`wq_*p*4y|d14g1Wr{4oB!L77Ry`ejKz6VKIO=5n`fs2Ndr6%yMIuYI3uj;Is6UgQOeIex#b z$i>djz%-}jNrX24-ZOCk`}L@-vN0L|V0@K#p^JacTPwT<$~bF_sv4)80VTr@P-9Jp zf>X!N&&Vfkfts+GS9yR5{rYZXKwZjKo;p-fxjJ=!7PPjAYOqtKeQF^BhR`&a z)T<*;-uwl8B<@zODbaQe__P>2;q}5tFm}pBpP~C)`5jWvv&G*R2gk^Ku6B5M$lg&M z3UM63&gvuo3GJY)QSl2!DG+;2k9^`sMR$`}#oZXYAB9~>G#}zMv5{+kQZda{!2gU} zYrE`W)@FxF%mrG`eV3M>vt%!#B^_Oc=39NvD>k!9OUcR?`55-7orBv>9vNijh+9Da z0SZDFI6TfXx6O=IU3MBUm^4oPeR`Zumr>H#!b!)>f`bLO`$juvK_}M=^;Vd};}UR- zCN(5#3}Rzi0uBIMg=dY&mbwOS?qn15VH0tJI_fzGY?Z%SfHCblhN=z0NSFtpk_oyUd2Zp|HnJ3&mL8HD~0pyH~Fv+r0-s?dk!r1WQ=&ckUom0;@R59%n`wuF! zp`PH3GbG|iTe=4WGt%@SDHlO&_grK;Y+{y-_7Gg&0iXk8dso>PZj)9r8@y$OZx|`s zlouT@^3o~o9e*;s*D)MJGlaHgcs2g&MS%O3(Q6)5IXZFWm#2&-0C&p4@R1Ar{35<~ zbXXzF&wJ}0$e<;r&Qo04FXkTv9_DCO@nv{+@^gVE_EFQp^Z zAQ59C4CNXJR)M5~bxxtuFZGof=*>L@K$&Iw4;Hvd{F>*^jjb-S#E%UW_6P^ZcFTy8 zR=+i8VT?z=#M?>lLwuS`rn_3M(#nGZaF?z-_yCagX{0%}!^bsMMx1UNyoUqn2FvA> zDq%MEo{bqT9gPpbQF4vIqAd$*{Qtgj_7_*6N9ymk{g#o}Z z&a*9F1~-lh=`oXR7c2>(fSc1AgEBrZ6P+_7d+o}<##v{Nto4%MjE}k=LJtnzg+$jH z9C961)RatzV8H7IW!aF-%DVDxHsr1jz^2!BmC#y@zTA_rD_Q5AYFe$BG36W_{i2SL zOHn=>fnS59RAXNwVP{{Nv(%4B&ef9a8`XY5`rnwpSlOeKs`OJ-#sP^cNNk`oFZ{Oe z(HP^mPfsE%uYQm%>7j2rcwFatcoIMHL@1rf?FtU!TeGnIg>`_7O?Ln2#Ba;ZVj5LQ zBD%N-laR>xEC>*OG;q%u`*E2bg{+;U^FvnIBUmlROb4HdXAV5*(R{6>bYbT_Fn~R` zD;^W1zT_8%Rs~K9;&iHbafO!>dNdHw$jo42Gon&bpLP^l+=dc|A8UGrI1Rw&0@Dp; zXC_*KGk8i~`b-oraW|PDZd_rpEBAJflD2vx8-Hd9<^(Y40ktt+tausJZfRYGwrjdu8LWIq<1;srU5 z*jlwT4K4(O>rUkxGF~ahd85f5zqeMzDjJJC7)B-`v8Jf=Nx>Tkp%oWf?bjQFk^oN5 z7L{KMp~xb+Z6+~IvnXaS=&Po_fw8$4Gt{9pL0EIq@NA;jLZQVDjkTh^dZ7Hp0LM?K zWp_G2set>7|IqKDyExcGAYBM$`5q^oygm{b;r_tcJmYBH zG*!q+_3BI*zg=~28LHUpasSmv?so;yISZQUd4vZt_%ABpF@cl)1!UcD*^#okyO0xF zxz|2@pH^o8j{n?yH`~_-4CS*Z&*|oLJ>{kk)mI{%Cls_8HEiswE z&{6WpB%-0!86(;69IEpO@C|Wzg3?9-XELIhw&jK@;@1r0v;zQOI|aW0CczDgLg;me zWdwAhqy4Y@qJdaY-g2Or^%%BnP=UFkF~na#!>b37H)jr<=Re-F(%%tf!rnNx@9wO- z`u2^?&sKNoB=PAOU^WDru=(j-WO%r6{zyjY-bQDu_GO;X1(5zC7>LwI@{S6Q0T|Rr z0e7-WPhXa6vp_GM4WtXt!>#<;(KbOQjP{7hQ^$7VJ8HYWOo%Funh=AI_?`wz_nK-BdttoF zN@1AnaB;oh;JUo=JC~&>$u7BW=-W+U60shX!(LM(J2vs{AfYG$oa!Mznt<6O#^P;B z8$&k!F7Tie{^JBs4wHK-oNCxOlCcW7_>>U{1QnKZ3Hf~II7VPY(JN5jO@yy!S&j%8 z8{d&X@z4{41PHoVG7Sl%2St59OG=9t+AL%dbbBMA9<;Hr+k{B&3FVXmcPA+&6iC66 zO8q4lVj&$n1=_BpbkSo17PWM-)#cn*Yk3kjxM7Kb9{Y?va0frmF@DJn7|ezeU(!g3 zs}mo2fwuuB*tQ3TIGs>H6@Gafx)ly%&$Ropa4}?OVXUO+4VIkCv1yom3Cvhxs)EEX zfkO=^UBGH646XbW1LIRsyX_nXf$(I`2UnyfgE|phv1L?q<1S3v(8@w+V>@b$b{1FyE^KB zw1~0=aZc%%A$(ROGJ16u&qTVwN^m-UB>b>`1x|otfCM zTECF^WFTTG^P>s53feddUZ*0)RVVmH_tJVJtXAl3KUC;0KG9Fb3QU&)LeZ3Dk!Ht6syA2b$j4SE`d~BRh~{d?olYZ5 zJ|9FnMbP@`%qh}PhOmY9BaC{l=XFvf!w6}bmDSUtm*zO^ECdGm@9{7+{Ec% zN+o=HpPL$dANOkIle;{|4M3q-Lo+=m8``sYe|Kd=wPAUNNMYtEAjh$$hc61=ydD4r z@k^hcsxv>==mno-5GP?Gd-_OpVMs_tll-e)@aQ;w!Zvte*o3$tm``K)CMj)qW3&`S z7BoO+QZS-Ii*FR$^4oJGTK!Ekg%-38Wqk*KSA+)Jt=XrW0rGQsRb9f)&*SoV#QKq3 zErB@;q;+l|eUU;U0?JH`_C)o5f*X$!MLTT;KL(7w4d$`67e^IkgJ|%h;7NsYw@;9QFT%bpJ&KzG*>0437 zP_YIiojIC8k>-Uu&PcDM+iTHWCDVNIKEA2Y4u~_7(jRX6Jm9cL`ph4LfG9HB^xk*^ zFLpyPDla6$`Hgk1Y#XxoAT7Mgl@>vqOKjZ<=Ye>C+v6fT%66)j0;I2$plT6gflE68 z_OqT*dspr#)44`vrui*`0Y=Fx8!R!M`ECt*`830d+|$ZoCF#Ko6K1RNM9V+$K%jyq zJ{yztzY!{BN-~iuZz*3Yas9=SXZ7t6*lDk+f{yr$e`clZ{{*7EZ%b$b)2DQB4Tsp# zXNVKtS}`fjl`9nm1^Dp(b7bs;|gq2*^u;i+VM&8rca^;u8 zztVGnQsrz%^RaXxCg!kru-zZd93beH#{1e@%76opiuzG{6=b08sXa%epnhC(tGHOP zBr9PxNdYZTnAba6mXgBna7(0T4N9!t8mt3`KyK?l{iqmtm^7t=!oqGSyGSOL@?0n0 z>j9ltJr0!L>DQnBu?DkRHFM+#Q#zBU)P)vfA%e2VpiFT$2T^}-uT$!)MG$IZ*M5`k zc*ml+@jSMNJ=s6lrb$;Wjo@6uKd-w!L%UjQKDa$)`_}C$Kda}Da37xTk14lL?6^Mp z(117JFK%H$|yZBmWft_G8ta(AxTce?sL&S?x5&)^#qIZv}26< zuy2xInvg!PVfq}O`bX9>Ob^GpT13nX6RL4NOnXoBsvolRW z-=QoYCWu+?u9VjtiOcMKZfmwc`}L9x9qXwyp=O$^+|)j}OV2KL=yo5L;I7WT?#Vc< jt2a_HHuX92t41r{toHIREzE-}z|T>4U$?qLXRrMqc1r*W literal 0 HcmV?d00001 diff --git a/example-ofxImGui/config.make b/example-ofxImGui/config.make new file mode 100644 index 0000000..e707f93 --- /dev/null +++ b/example-ofxImGui/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +# OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +# +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +################################################################################ +#PROJECT_LDFLAGS=-lEGL_mesa + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +#PROJECT_DEFINES = + + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/example-ofxImGui/src/MyTheme.cpp b/example-ofxImGui/src/MyTheme.cpp new file mode 100644 index 0000000..77f66b1 --- /dev/null +++ b/example-ofxImGui/src/MyTheme.cpp @@ -0,0 +1,69 @@ +#include "MyTheme.h" + + +ofColor getRandomColor() +{ + return ofColor(ofRandom(0, 255), ofRandom(0, 255), ofRandom(0, 255), 255); +} + +void MyTheme::setup() +{ + ImGuiStyle* style = &ImGui::GetStyle(); + + style->WindowMinSize = ImVec2(160, 65); + style->FramePadding = ImVec2(4, 2); + style->ItemSpacing = ImVec2(6, 2); + style->ItemInnerSpacing = ImVec2(6, 4); + style->Alpha = 1.0f; + style->WindowRounding = 0.0f; + style->FrameRounding = 0.0f; + style->IndentSpacing = 6.0f; + style->ItemInnerSpacing = ImVec2(2, 4); + style->ColumnsMinSpacing = 50.0f; + style->GrabMinSize = 14.0f; + style->GrabRounding = 0.0f; + style->ScrollbarSize = 12.0f; + style->ScrollbarRounding = 0.0f; + + + style->Colors[ImGuiCol_Text] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_TextDisabled] = ImVec4(getRandomColor(), 0.58f); + style->Colors[ImGuiCol_WindowBg] = ImVec4(getRandomColor(), 0.70f); + style->Colors[ImGuiCol_ChildWindowBg] = ImVec4(getRandomColor(), 0.58f); + style->Colors[ImGuiCol_Border] = ImVec4(getRandomColor(), 0.00f); + style->Colors[ImGuiCol_BorderShadow] = ImVec4(getRandomColor(), 0.00f); + style->Colors[ImGuiCol_FrameBg] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_FrameBgHovered] = ImVec4(getRandomColor(), 0.78f); + style->Colors[ImGuiCol_FrameBgActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_TitleBg] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_TitleBgCollapsed] = ImVec4(getRandomColor(), 0.75f); + style->Colors[ImGuiCol_TitleBgActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_MenuBarBg] = ImVec4(getRandomColor(), 0.47f); + style->Colors[ImGuiCol_ScrollbarBg] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_ScrollbarGrab] = ImVec4(getRandomColor(), 0.21f); + style->Colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(getRandomColor(), 0.78f); + style->Colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_CheckMark] = ImVec4(getRandomColor(), 0.80f); + style->Colors[ImGuiCol_SliderGrab] = ImVec4(getRandomColor(), 0.14f); + style->Colors[ImGuiCol_SliderGrabActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_Button] = ImVec4(getRandomColor(), 0.14f); + style->Colors[ImGuiCol_ButtonHovered] = ImVec4(getRandomColor(), 0.86f); + style->Colors[ImGuiCol_ButtonActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_Header] = ImVec4(getRandomColor(), 0.76f); + style->Colors[ImGuiCol_HeaderHovered] = ImVec4(getRandomColor(), 0.86f); + style->Colors[ImGuiCol_HeaderActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_Column] = ImVec4(getRandomColor(), 0.32f); + style->Colors[ImGuiCol_ColumnHovered] = ImVec4(getRandomColor(), 0.78f); + style->Colors[ImGuiCol_ColumnActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_ResizeGrip] = ImVec4(getRandomColor(), 0.04f); + style->Colors[ImGuiCol_ResizeGripHovered] = ImVec4(getRandomColor(), 0.78f); + style->Colors[ImGuiCol_ResizeGripActive] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_PlotLines] = ImVec4(getRandomColor(), 0.63f); + style->Colors[ImGuiCol_PlotLinesHovered] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_PlotHistogram] = ImVec4(getRandomColor(), 0.63f); + style->Colors[ImGuiCol_PlotHistogramHovered] = ImVec4(getRandomColor(), 1.00f); + style->Colors[ImGuiCol_TextSelectedBg] = ImVec4(getRandomColor(), 0.43f); + style->Colors[ImGuiCol_PopupBg] = ImVec4(getRandomColor(), 0.92f); + style->Colors[ImGuiCol_ModalWindowDarkening] = ImVec4(getRandomColor(), 0.73f); + +} diff --git a/example-ofxImGui/src/MyTheme.h b/example-ofxImGui/src/MyTheme.h new file mode 100644 index 0000000..1c31d58 --- /dev/null +++ b/example-ofxImGui/src/MyTheme.h @@ -0,0 +1,12 @@ +#pragma once + +#include "BaseTheme.h" +#include "ofMain.h" + +class MyTheme: public ofxImGui::BaseTheme +{ +public: + + void setup() override; + +}; diff --git a/example-ofxImGui/src/main.cpp b/example-ofxImGui/src/main.cpp new file mode 100644 index 0000000..50302d0 --- /dev/null +++ b/example-ofxImGui/src/main.cpp @@ -0,0 +1,18 @@ +#include "ofMain.h" +#include "ofApp.h" +#include "ofxRPI4Window.h" + +//======================================================================== +int main( ){ + + ofSetLogLevel(OF_LOG_VERBOSE); + + ofGLESWindowSettings settings; + settings.setSize(1280, 720); + settings.setGLESVersion(2); + auto window = std::make_shared(settings); + + auto app = std::make_shared(); + ofRunApp(window, app); + ofRunMainLoop(); +} diff --git a/example-ofxImGui/src/ofApp.cpp b/example-ofxImGui/src/ofApp.cpp new file mode 100755 index 0000000..db4ab5b --- /dev/null +++ b/example-ofxImGui/src/ofApp.cpp @@ -0,0 +1,218 @@ +#include "ofApp.h" + +//-------------------------------------------------------------- +void ofApp::setup() +{ + ofSetLogLevel(OF_LOG_VERBOSE); + + //required call + gui.setup(); + + ImGui::GetIO().MouseDrawCursor = false; + //backgroundColor is stored as an ImVec4 type but can handle ofColor + backgroundColor = ofColor(114, 144, 154); + show_test_window = true; + show_another_window = false; + floatValue = 0.0f; + + //load your own ofImage + imageButtonSource.load("of.png"); + imageButtonID = gui.loadImage(imageButtonSource); + + //or have the loading done for you if you don't need the ofImage reference + //imageButtonID = gui.loadImage("of.png"); + + //can also use ofPixels in same manner + ofLoadImage(pixelsButtonSource, "of_upside_down.png"); + pixelsButtonID = gui.loadPixels(pixelsButtonSource); + + //and alt method + //pixelsButtonID = gui.loadPixels("of_upside_down.png"); + + //pass in your own texture reference if you want to keep it + textureSourceID = gui.loadTexture(textureSource, "of_upside_down.png"); + + //or just pass a path + //textureSourceID = gui.loadTexture("of_upside_down.png"); + + ofLogVerbose() << "textureSourceID: " << textureSourceID; + + ofDirectory dataDirectory(ofToDataPath("", true)); + + files = dataDirectory.getFiles(); + for(size_t i=0; i as a data source + static int currentListBoxIndex = 0; + if(ofxImGui::VectorListBox("VectorListBox", ¤tListBoxIndex, fileNames)) + { + ofLog() << " VectorListBox FILE PATH: " << files[currentListBoxIndex].getAbsolutePath(); + } + + //ofxImGui::VectorCombo allows for the use of a vector as a data source + static int currentFileIndex = 0; + if(ofxImGui::VectorCombo("VectorCombo", ¤tFileIndex, fileNames)) + { + ofLog() << "VectorCombo FILE PATH: " << files[currentFileIndex].getAbsolutePath(); + } + } + + + + //GetImTextureID is a static function define in Helpers.h that accepts ofTexture, ofImage, or GLuint + if(ImGui::ImageButton(GetImTextureID(imageButtonID), ImVec2(200, 200))) + { + ofLog() << "PRESSED"; + } + + //or do it manually + ImGui::Image((ImTextureID)(uintptr_t)textureSourceID, ImVec2(200, 200)); + + ImGui::Image(GetImTextureID(pixelsButtonID), ImVec2(200, 200)); + + + + + + + //required to call this at end + gui.end(); + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + + ofLogVerbose(__FUNCTION__) << key; + switch (key) + { + + case 's': + { + break; + } + } + +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + ofLogVerbose(__FUNCTION__) << key; + +} + + +void ofApp::mouseScrolled(float x, float y) +{ + ofLogVerbose(__FUNCTION__) << "x: " << x << " y: " << y; +} +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/example-ofxImGui/src/ofApp.h b/example-ofxImGui/src/ofApp.h new file mode 100755 index 0000000..57d281c --- /dev/null +++ b/example-ofxImGui/src/ofApp.h @@ -0,0 +1,41 @@ +#pragma once + +#include "ofMain.h" +#include "ofxImGui.h" +#include "MyTheme.h" + +class ofApp : public ofBaseApp{ +public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + void mouseScrolled(float x, float y); + + ofxImGui::Gui gui; + ImVec4 backgroundColor; + bool show_test_window; + bool show_another_window; + + float floatValue; + ofImage imageButtonSource; + GLuint imageButtonID; + + ofPixels pixelsButtonSource; + GLuint pixelsButtonID; + + ofTexture textureSource; + GLuint textureSourceID; + + std::vector fileNames; + std::vector files; +}; diff --git a/example-pointsAsTextures/Makefile b/example-pointsAsTextures/Makefile new file mode 100644 index 0000000..177e172 --- /dev/null +++ b/example-pointsAsTextures/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=$(realpath ../../..) +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/example-pointsAsTextures/addons.make b/example-pointsAsTextures/addons.make new file mode 100644 index 0000000..c15601c --- /dev/null +++ b/example-pointsAsTextures/addons.make @@ -0,0 +1 @@ +ofxRPI4Window diff --git a/example-pointsAsTextures/bin/data/.gitkeep b/example-pointsAsTextures/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/example-pointsAsTextures/bin/data/dot.png b/example-pointsAsTextures/bin/data/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..491d263d1b46e3fe401232fd3795d25aac5d1c13 GIT binary patch literal 8691 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 + + auto app = std::make_shared(); + ofRunApp(window, app); + ofRunMainLoop(); +} diff --git a/example-pointsAsTextures/src/ofApp.cpp b/example-pointsAsTextures/src/ofApp.cpp new file mode 100644 index 0000000..d16ff0c --- /dev/null +++ b/example-pointsAsTextures/src/ofApp.cpp @@ -0,0 +1,204 @@ +#include "ofApp.h" + +//-------------------------------------------------------------- +void ofApp::setup() { + + ofBackgroundHex(0x000000); + ofSetFrameRate(60); + ofSetVerticalSync(true); + + // load the texure + ofDisableArbTex(); + ofLoadImage(texture, "dot.png"); + + // set the camera distance + camDist = 1605; + camera.setDistance(camDist); + + // randomly add a point on a sphere + int num = 500; + float radius = 1000; + for(int i = 0; i points; + vector sizes; + + ofVbo vbo; + ofShader shader; + ofEasyCam camera; + + float camDist; + + ofTexture texture; +}; diff --git a/example-vboMeshDrawInstanced/Makefile b/example-vboMeshDrawInstanced/Makefile new file mode 100644 index 0000000..177e172 --- /dev/null +++ b/example-vboMeshDrawInstanced/Makefile @@ -0,0 +1,13 @@ +# Attempt to load a config.make file. +# If none is found, project defaults in config.project.make will be used. +ifneq ($(wildcard config.make),) + include config.make +endif + +# make sure the the OF_ROOT location is defined +ifndef OF_ROOT + OF_ROOT=$(realpath ../../..) +endif + +# call the project makefile! +include $(OF_ROOT)/libs/openFrameworksCompiled/project/makefileCommon/compile.project.mk diff --git a/example-vboMeshDrawInstanced/addons.make b/example-vboMeshDrawInstanced/addons.make new file mode 100644 index 0000000..c15601c --- /dev/null +++ b/example-vboMeshDrawInstanced/addons.make @@ -0,0 +1 @@ +ofxRPI4Window diff --git a/example-vboMeshDrawInstanced/bin/data/.gitkeep b/example-vboMeshDrawInstanced/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/example-vboMeshDrawInstanced/bin/data/depth_image.png b/example-vboMeshDrawInstanced/bin/data/depth_image.png new file mode 100644 index 0000000000000000000000000000000000000000..18656ddc4125f8b0bed414d431e9c16b37732aee GIT binary patch literal 19442 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 d7K_FI8vrm;oQM*pVRirj002ovPDHLkV1m55Ihg x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +// --------- / end simplex noise + + + +// ---------------------------------------------------------------------- + +void main() +{ + + int iCount = 128; + + // when drawing instanced geometry, we can use gl_InstanceID + // this tells you which primitive we are currently working on + + // we would like to spread our primitives out evenly along the x and an y coordinates + // we calculate an x and an y coordinate value based on the current instance ID + + float instanceX = float(gl_InstanceID%(iCount) - iCount/2) / 128.0; + float instanceY = float(gl_InstanceID/(iCount) - iCount/2) / 128.0; + + // next we get a mix-value, based on the current instance x coordinate and time, which + // will help us to achieve some animation happiness. + + float timeDependentInstanceXValue = mod(instanceX * 0.25 + timeValue *2.0, 1.0); + + + // get pixel depth by sampling from our depth texture. + // we sample from the deph texture, but because our sample position moves along + // along the x-coodinate depending on time, the result will animate. + + vec2 samplePos = vec2(timeDependentInstanceXValue, instanceY + 0.5); + + float pixelDepth = texture(tex0,samplePos).g; + + // set the color for this primitive based on the current pixelDepth modified by the time dependent instance x value. + colorVarying = vec4(globalColor.rgb * pixelDepth, globalColor.a) * vec4(1.0,1.0-timeDependentInstanceXValue,(instanceX + 0.5) ,1.0); + + vec4 vPos = position; + + // extrude our primitive along the z coordinate, based on current PixelDepth. + vPos.z = (vPos.z + 1.0) * pixelDepth * 200.0; + // this will pull pur vertices apart by four time their original coordinate values, + // then move them by an snoise value which is the same for every primitive + // simplex noise makes things look a little more organic. + vPos.x = vPos.x * 4.0 + snoise(vec2(instanceX,instanceY)) * 20.0; + vPos.y = vPos.y * 4.0 + snoise(vec2(1.0-instanceX,instanceY)) * 300.0; + // this will distribute our boxes in space, + vPos = vPos + vec4(instanceX*20.0*128.0,instanceY*10.0*128.0, 0,0); + vPos.z = vPos.z + snoise(vec2(instanceX,instanceY)) * 100.0; + + + gl_Position = projectionMatrix * modelViewMatrix * vPos ; +} diff --git a/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.frag b/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.frag new file mode 100644 index 0000000..7155231 --- /dev/null +++ b/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.frag @@ -0,0 +1,34 @@ +// +// _____ ___ +// / / / / vboMeshDrawInstancedExample +// / __/ * / /__ (c) ponies & light, 2013. All rights reserved. +// /__/ /_____/ poniesandlight.co.uk +// +// Created by tim on 30/07/2013. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +#version 120 +#extension GL_EXT_gpu_shader4 : require + +varying vec4 colorVarying; + +void main(){ + + gl_FragColor = colorVarying; +} \ No newline at end of file diff --git a/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.vert b/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.vert new file mode 100644 index 0000000..87a306d --- /dev/null +++ b/example-vboMeshDrawInstanced/bin/data/shaders/instanced_120.vert @@ -0,0 +1,162 @@ +// +// _____ ___ +// / / / / vboMeshDrawInstancedExample +// / __/ * / /__ (c) ponies & light, 2013. All rights reserved. +// /__/ /_____/ poniesandlight.co.uk +// +// Created by tim on 30/07/2013. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#version 120 +#extension GL_EXT_gpu_shader4 : require + +uniform vec4 globalColor = vec4(1.0); +uniform sampler2D tex0; // we use this to sample depth data for our boxes. +uniform float timeValue=0.0; // we get this from our ofApp, it's a time value moving from 0 to 1 every 30 seconds + +varying vec4 colorVarying; + +// ---------- A simplex noise helper method to please the eye: + +// --------- +// +// Description : Array and textureless GLSL 2D simplex noise function. +// Author : Ian McEwan, Ashima Arts. +// Maintainer : ijm +// Lastmod : 20110822 (ijm) +// License : Copyright (C) 2011 Ashima Arts. All rights reserved. +// Distributed under the MIT License. See LICENSE file. +// https://github.com/ashima/webgl-noise +// + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+1.0)*x); +} + +float snoise(vec2 v) +{ + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} + +// --------- / end simplex noise + + + +// ---------------------------------------------------------------------- + +void main() +{ + + float iCount = 128; + + // when drawing instanced geometry, we can use gl_InstanceID + // this tells you which primitive we are currently working on + + // we would like to spread our primitives out evenly along the x and an y coordinates + // we calculate an x and an y coordinate value based on the current instance ID + + float instanceX = (mod(gl_InstanceID,iCount) - iCount/2.0) / 128.0; + float instanceY = ((gl_InstanceID/iCount) - iCount/2.0) / 128.0; + + // next we get a mix-value, based on the current instance x coordinate and time, which + // will help us to achieve some animation happiness. + + float timeDependentInstanceXValue = mod(instanceX * 0.25 + timeValue *2, 1.0); + + + // get pixel depth by sampling from our depth texture. + // we sample from the deph texture, but because our sample position moves along + // along the x-coodinate depending on time, the result will animate. + + vec2 samplePos = vec2(timeDependentInstanceXValue, instanceY + 0.5); + + float pixelDepth = texture2D(tex0,samplePos).g; + + // set the color for this primitive based on the current pixelDepth modified by the time dependent instance x value. + colorVarying = vec4(globalColor.rgb * pixelDepth, globalColor.a) * vec4(1.0,1.0-timeDependentInstanceXValue,(instanceX + 0.5) ,1.0); + + vec4 vPos = gl_Vertex; + + // extrude our primitive along the z coordinate, based on current PixelDepth. + vPos.z = (vPos.z + 1.0) * pixelDepth * 200.0; + // this will pull pur vertices apart by four time their original coordinate values, + // then move them by an snoise value which is the same for every primitive + // simplex noise makes things look a little more organic. + vPos.x = vPos.x * 4.0 + snoise(vec2(instanceX,instanceY)) * 20.0; + vPos.y = vPos.y * 4.0 + snoise(vec2(1.0-instanceX,instanceY)) * 300.0; + // this will distribute our boxes in space, + vPos = vPos + vec4(instanceX*20.0*128.0,instanceY*10.0*128.0, 0.0,0.0); + vPos.z = vPos.z + snoise(vec2(instanceX,instanceY)) * 100.0; + + + gl_Position = gl_ModelViewProjectionMatrix * vPos ; +} \ No newline at end of file diff --git a/example-vboMeshDrawInstanced/config.make b/example-vboMeshDrawInstanced/config.make new file mode 100644 index 0000000..e707f93 --- /dev/null +++ b/example-vboMeshDrawInstanced/config.make @@ -0,0 +1,142 @@ +################################################################################ +# CONFIGURE PROJECT MAKEFILE (optional) +# This file is where we make project specific configurations. +################################################################################ + +################################################################################ +# OF ROOT +# The location of your root openFrameworks installation +# (default) OF_ROOT = ../../.. +################################################################################ +# OF_ROOT = ../../.. + +################################################################################ +# PROJECT ROOT +# The location of the project - a starting place for searching for files +# (default) PROJECT_ROOT = . (this directory) +# +################################################################################ +# PROJECT_ROOT = . + +################################################################################ +# PROJECT SPECIFIC CHECKS +# This is a project defined section to create internal makefile flags to +# conditionally enable or disable the addition of various features within +# this makefile. For instance, if you want to make changes based on whether +# GTK is installed, one might test that here and create a variable to check. +################################################################################ +# None + +################################################################################ +# PROJECT EXTERNAL SOURCE PATHS +# These are fully qualified paths that are not within the PROJECT_ROOT folder. +# Like source folders in the PROJECT_ROOT, these paths are subject to +# exlclusion via the PROJECT_EXLCUSIONS list. +# +# (default) PROJECT_EXTERNAL_SOURCE_PATHS = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXTERNAL_SOURCE_PATHS = + +################################################################################ +# PROJECT EXCLUSIONS +# These makefiles assume that all folders in your current project directory +# and any listed in the PROJECT_EXTERNAL_SOURCH_PATHS are are valid locations +# to look for source code. The any folders or files that match any of the +# items in the PROJECT_EXCLUSIONS list below will be ignored. +# +# Each item in the PROJECT_EXCLUSIONS list will be treated as a complete +# string unless teh user adds a wildcard (%) operator to match subdirectories. +# GNU make only allows one wildcard for matching. The second wildcard (%) is +# treated literally. +# +# (default) PROJECT_EXCLUSIONS = (blank) +# +# Will automatically exclude the following: +# +# $(PROJECT_ROOT)/bin% +# $(PROJECT_ROOT)/obj% +# $(PROJECT_ROOT)/%.xcodeproj +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_EXCLUSIONS = + +################################################################################ +# PROJECT LINKER FLAGS +# These flags will be sent to the linker when compiling the executable. +# +# (default) PROJECT_LDFLAGS = -Wl,-rpath=./libs +# +# Note: Leave a leading space when adding list items with the += operator +# +# Currently, shared libraries that are needed are copied to the +# $(PROJECT_ROOT)/bin/libs directory. The following LDFLAGS tell the linker to +# add a runtime path to search for those shared libraries, since they aren't +# incorporated directly into the final executable application binary. +################################################################################ +#PROJECT_LDFLAGS=-lEGL_mesa + +################################################################################ +# PROJECT DEFINES +# Create a space-delimited list of DEFINES. The list will be converted into +# CFLAGS with the "-D" flag later in the makefile. +# +# (default) PROJECT_DEFINES = (blank) +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +#PROJECT_DEFINES = + + +################################################################################ +# PROJECT CFLAGS +# This is a list of fully qualified CFLAGS required when compiling for this +# project. These CFLAGS will be used IN ADDITION TO the PLATFORM_CFLAGS +# defined in your platform specific core configuration files. These flags are +# presented to the compiler BEFORE the PROJECT_OPTIMIZATION_CFLAGS below. +# +# (default) PROJECT_CFLAGS = (blank) +# +# Note: Before adding PROJECT_CFLAGS, note that the PLATFORM_CFLAGS defined in +# your platform specific configuration file will be applied by default and +# further flags here may not be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CFLAGS = + +################################################################################ +# PROJECT OPTIMIZATION CFLAGS +# These are lists of CFLAGS that are target-specific. While any flags could +# be conditionally added, they are usually limited to optimization flags. +# These flags are added BEFORE the PROJECT_CFLAGS. +# +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE flags are only applied to RELEASE targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_RELEASE = (blank) +# +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG flags are only applied to DEBUG targets. +# +# (default) PROJECT_OPTIMIZATION_CFLAGS_DEBUG = (blank) +# +# Note: Before adding PROJECT_OPTIMIZATION_CFLAGS, please note that the +# PLATFORM_OPTIMIZATION_CFLAGS defined in your platform specific configuration +# file will be applied by default and further optimization flags here may not +# be needed. +# +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_OPTIMIZATION_CFLAGS_RELEASE = +# PROJECT_OPTIMIZATION_CFLAGS_DEBUG = + +################################################################################ +# PROJECT COMPILERS +# Custom compilers can be set for CC and CXX +# (default) PROJECT_CXX = (blank) +# (default) PROJECT_CC = (blank) +# Note: Leave a leading space when adding list items with the += operator +################################################################################ +# PROJECT_CXX = +# PROJECT_CC = diff --git a/example-vboMeshDrawInstanced/src/main.cpp b/example-vboMeshDrawInstanced/src/main.cpp new file mode 100644 index 0000000..50302d0 --- /dev/null +++ b/example-vboMeshDrawInstanced/src/main.cpp @@ -0,0 +1,18 @@ +#include "ofMain.h" +#include "ofApp.h" +#include "ofxRPI4Window.h" + +//======================================================================== +int main( ){ + + ofSetLogLevel(OF_LOG_VERBOSE); + + ofGLESWindowSettings settings; + settings.setSize(1280, 720); + settings.setGLESVersion(2); + auto window = std::make_shared(settings); + + auto app = std::make_shared(); + ofRunApp(window, app); + ofRunMainLoop(); +} diff --git a/example-vboMeshDrawInstanced/src/ofApp.cpp b/example-vboMeshDrawInstanced/src/ofApp.cpp new file mode 100644 index 0000000..906ec78 --- /dev/null +++ b/example-vboMeshDrawInstanced/src/ofApp.cpp @@ -0,0 +1,190 @@ +#include "ofApp.h" + +/** + * tig: This example shows how to draw instanced geometry using + * ofVboMesh.drawInstanced() and matching GLSL shader code. + * The most interesting things will happen in the shader files, + * and in the draw() method, where everything is set up properly + * to allow instanced rendering. + * + * Note that you can feed any ofVboMesh to the instanced draw method. + * + */ + +//-------------------------------------------------------------- +void ofApp::setup(){ + + // initialize variables: + + isShaderDirty = true; // this flag will tell us whether to reload our shader from disk. + // this allows you to change your shaders without having to restart + // your app. we'll set it up so that pressing the SPACE key on your + // keyboard will reload the shader. + + // initialize screen, lock framerate to vsync: + + ofSetFrameRate(0); + ofSetVerticalSync(true); + + + // generate a box vboMesh from a primitive. + + ofBoxPrimitive tmpBox; + // set the size to be 2 units. + tmpBox.set(2); + + mVboBox = tmpBox.getMesh(); + + // load depth image + ofDisableArbTex(); + // note that we disable arb tex, meaning we will use normalized texture coordinates, + // where a texture's x and y coordinate are each expressed as a normalized float. + // this makes things slightly easier in the shader. + + // load the depth image into our texture + ofLoadImage(mTexDepth, "depth_image.png"); + ofEnableArbTex(); + + mCamMain.setupPerspective(false,60,0,10000); + +} + +//-------------------------------------------------------------- +void ofApp::update(){ + + if (isShaderDirty){ + + // only reload the shader if it is 'dirty', i.e. the user has either requested reloading + // or the 'isShaderDirty' flag has been initialized to true in setup() + + // Since we are using a shared_ptr around the shader, the old shader will get destroyed + // automatically as soon as we assign a new shader object to our mShdInstanced. + + ofLogNotice() << "Reloading Shader."; + mShdInstanced = shared_ptr(new ofShader()); + // most of the instanced drawing magic happens in the shaders: +#ifdef USE_PROGRAMMABLE_GL + // if we are using programmable GL, we load the GLSL version 150 shader pair. + mShdInstanced->load("shaders/instanced.vert", "shaders/instanced.frag"); +#else + // if we are using fixed function GL, we load the GLSL version 120 shader pair. + mShdInstanced->load("shaders/instanced_120.vert", "shaders/instanced_120.frag"); +#endif + GLint err = glGetError(); + if (err != GL_NO_ERROR){ + ofLogNotice() << "Load Shader came back with GL error: " << err; + } + + isShaderDirty = false; + } + + ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)); + +} + +//-------------------------------------------------------------- +void ofApp::draw(){ + + ofEnableDepthTest(); + // we don't care about alpha blending in this example, and by default alpha blending is on in openFrameworks > 0.8.0 + // so we de-activate it for now. + ofDisableAlphaBlending(); + + ofBackgroundGradient(ofColor(18,33,54), ofColor(18,22,28)); + + ofSetColor(ofColor::white); + mCamMain.begin(); + + // bind the shader + mShdInstanced->begin(); + // give the shader access to our texture + mShdInstanced->setUniformTexture("tex0", mTexDepth, 0); + // feed the shader a normalized float value that changes over time, to animate things a little + mShdInstanced->setUniform1f("timeValue", (ofGetElapsedTimeMillis() % 30000) / 30000.0f); + // we only want to see triangles facing the camera. + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + + // let's draw 128 * 128 == 16384 boxes ! + mVboBox.drawInstanced(OF_MESH_FILL, 128*128); + + glDisable(GL_CULL_FACE); + mShdInstanced->end(); + + mCamMain.end(); + + ofDisableDepthTest(); + + ofSetColor(ofColor::white); + ofDrawBitmapString("Use mouse to move camera.\nPress 'f' to toggle fullscreen;\nSPACEBAR to reload shader.", 10, 20); + + ofEnableAlphaBlending(); + mTexDepth.draw(0, 0, 100, 100); + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + + switch (key) { + case ' ': + isShaderDirty = true; + // mark the shader as dirty - this will reload the shader. + break; + case 'f': + ofToggleFullscreen(); + break; + default: + break; + } +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/example-vboMeshDrawInstanced/src/ofApp.h b/example-vboMeshDrawInstanced/src/ofApp.h new file mode 100644 index 0000000..b136d1f --- /dev/null +++ b/example-vboMeshDrawInstanced/src/ofApp.h @@ -0,0 +1,42 @@ +#pragma once + +// tig: uncomment the following line to use programmable GL , and GLSL 150 +// otherwise this example will run using OpenGL 2.0 / GLSL 1.20 + +#define USE_PROGRAMMABLE_GL + +// note that if you use programmable GL, a different set of shaders will be loaded. +// see ofApp.cpp + + +#include "ofMain.h" + +class ofApp : public ofBaseApp{ + + ofVboMesh mVboBox; + + ofEasyCam mCamMain; + + shared_ptr mShdInstanced; + ofTexture mTexDepth; + + bool isShaderDirty; + +public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + +};