From dc241f468edea3467609598863f28c6d36610a0e Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Mon, 23 Apr 2018 15:51:33 +0200 Subject: [PATCH 01/24] Fix ImGuiDemo --- src/ImGuiDemo/ImGuiDemo.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ImGuiDemo/ImGuiDemo.cc b/src/ImGuiDemo/ImGuiDemo.cc index d69935d..6b0968a 100644 --- a/src/ImGuiDemo/ImGuiDemo.cc +++ b/src/ImGuiDemo/ImGuiDemo.cc @@ -30,7 +30,7 @@ OryolMain(ImGuiDemoApp); //------------------------------------------------------------------------------ AppState::Code ImGuiDemoApp::OnInit() { - Gfx::Setup(GfxSetup::Window(1024, 700, "Oryol ImGui Demo")); + Gfx::Setup(GfxDesc().Width(1024).Height(700).Title("Oryol ImGui Demo")); Input::Setup(); IMUI::Setup(); this->lastTimePoint = Clock::Now(); @@ -42,7 +42,7 @@ ImGuiDemoApp::OnInit() { AppState::Code ImGuiDemoApp::OnRunning() { - Gfx::BeginPass(PassAction::Clear(glm::vec4(this->clearColor.x, this->clearColor.y, this->clearColor.z, 1.0f))); + Gfx::BeginPass(PassAction().Clear(this->clearColor.x, this->clearColor.y, this->clearColor.z, 1.0f)); IMUI::NewFrame(Clock::LapTime(this->lastTimePoint)); // 1. Show a simple window @@ -66,7 +66,7 @@ ImGuiDemoApp::OnRunning() { // 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowTestWindow() if (this->showTestWindow) { ImGui::SetNextWindowPos(ImVec2(460, 20), ImGuiSetCond_FirstUseEver); - ImGui::ShowTestWindow(&showTestWindow); + ImGui::ShowTestWindow(); } ImGui::Render(); From 2e6cad8335bdc269a1df415379eb68f27328295a Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Mon, 23 Apr 2018 16:22:53 +0200 Subject: [PATCH 02/24] Fix Common module --- src/Common/CameraHelper.cc | 4 +- src/Common/OrbLoader.cc | 81 ++++++++++++++++++++++++-------------- src/Common/OrbLoader.h | 4 +- src/Common/OrbModel.h | 8 ++-- src/Common/Wireframe.cc | 46 ++++++++++++---------- src/Common/Wireframe.h | 2 +- 6 files changed, 86 insertions(+), 59 deletions(-) diff --git a/src/Common/CameraHelper.cc b/src/Common/CameraHelper.cc index 7d4066b..ba85380 100644 --- a/src/Common/CameraHelper.cc +++ b/src/Common/CameraHelper.cc @@ -80,8 +80,8 @@ CameraHelper::HandleInput() { void CameraHelper::UpdateTransforms() { // recompute projection matrix if framebuffer size has changed - int w = Gfx::DisplayAttrs().FramebufferWidth; - int h = Gfx::DisplayAttrs().FramebufferHeight; + int w = Gfx::DisplayAttrs().Width; + int h = Gfx::DisplayAttrs().Height; if ((w != this->fbWidth) || (h != this->fbHeight)) { this->fbWidth = w; this->fbHeight = h; diff --git a/src/Common/OrbLoader.cc b/src/Common/OrbLoader.cc index b934def..f3a92e8 100644 --- a/src/Common/OrbLoader.cc +++ b/src/Common/OrbLoader.cc @@ -12,29 +12,39 @@ namespace Oryol { -const uint32_t MeshSignature = 1; -const uint32_t AnimSkeletonSignature = 2; -const uint32_t AnimLibrarySignature = 3; +constexpr uint32_t VBufSignature = 1; +constexpr uint32_t IBufSignature = 2; +constexpr uint32_t AnimSkeletonSignature = 3; +constexpr uint32_t AnimLibrarySignature = 4; + +struct meshDesc { + BufferDesc vertexBufferDesc; + BufferDesc indexBufferDesc; + VertexLayout layout; + int numVertices = 0; + int numIndices = 0; + IndexType::Code indexType = IndexType::UInt16; + InlineArray primGroups; +}; //------------------------------------------------------------------------------ -static MeshSetup makeMeshSetup(const OrbFile& orb, const Locator& loc) { - auto setup = MeshSetup::FromData(); - setup.Locator = loc; +static meshDesc makeMeshDesc(const uint8_t* data, const OrbFile& orb, const StringAtom& name) { + meshDesc desc; for (const auto& src : orb.VertexComps) { VertexLayout::Component dst; switch (src.Attr) { - case OrbVertexAttr::Position: dst.Attr = VertexAttr::Position; break; - case OrbVertexAttr::Normal: dst.Attr = VertexAttr::Normal; break; - case OrbVertexAttr::TexCoord0: dst.Attr = VertexAttr::TexCoord0; break; - case OrbVertexAttr::TexCoord1: dst.Attr = VertexAttr::TexCoord1; break; - case OrbVertexAttr::TexCoord2: dst.Attr = VertexAttr::TexCoord2; break; - case OrbVertexAttr::TexCoord3: dst.Attr = VertexAttr::TexCoord3; break; - case OrbVertexAttr::Tangent: dst.Attr = VertexAttr::Tangent; break; - case OrbVertexAttr::Binormal: dst.Attr = VertexAttr::Binormal; break; - case OrbVertexAttr::Weights: dst.Attr = VertexAttr::Weights; break; - case OrbVertexAttr::Indices: dst.Attr = VertexAttr::Indices; break; - case OrbVertexAttr::Color0: dst.Attr = VertexAttr::Color0; break; - case OrbVertexAttr::Color1: dst.Attr = VertexAttr::Color1; break; + case OrbVertexAttr::Position: dst.Name = "position"; break; + case OrbVertexAttr::Normal: dst.Name = "normal"; break; + case OrbVertexAttr::TexCoord0: dst.Name = "texcoord0"; break; + case OrbVertexAttr::TexCoord1: dst.Name = "texcoord1"; break; + case OrbVertexAttr::TexCoord2: dst.Name = "texcoord2"; break; + case OrbVertexAttr::TexCoord3: dst.Name = "texcoord3"; break; + case OrbVertexAttr::Tangent: dst.Name = "tangent"; break; + case OrbVertexAttr::Binormal: dst.Name = "binormal"; break; + case OrbVertexAttr::Weights: dst.Name = "weights"; break; + case OrbVertexAttr::Indices: dst.Name = "indices"; break; + case OrbVertexAttr::Color0: dst.Name = "color0"; break; + case OrbVertexAttr::Color1: dst.Name = "color1"; break; default: break; } switch (src.Format) { @@ -52,17 +62,25 @@ static MeshSetup makeMeshSetup(const OrbFile& orb, const Locator& loc) { case OrbVertexFormat::Short4N: dst.Format = VertexFormat::Short4N; break; default: break; } - setup.Layout.Add(dst); + desc.layout.Add(dst); } for (const auto& subMesh : orb.Meshes) { - setup.AddPrimitiveGroup(PrimitiveGroup(subMesh.FirstIndex, subMesh.NumIndices)); - setup.NumVertices += subMesh.NumVertices; - setup.NumIndices += subMesh.NumIndices; + desc.primGroups.Add(PrimitiveGroup(subMesh.FirstIndex, subMesh.NumIndices)); + desc.numVertices += subMesh.NumVertices; + desc.numIndices += subMesh.NumIndices; } - setup.IndicesType = IndexType::Index16; - setup.VertexDataOffset = orb.VertexDataOffset; - setup.IndexDataOffset = orb.IndexDataOffset; - return setup; + desc.vertexBufferDesc = BufferDesc() + .Type(BufferType::VertexBuffer) + .Locator(Locator(name, VBufSignature)) + .Size(desc.layout.ByteSize() * desc.numVertices) + .Content(data + orb.VertexDataOffset); + desc.indexBufferDesc = BufferDesc() + .Type(BufferType::IndexBuffer) + .Locator(Locator(name, IBufSignature)) + .Size(sizeof(uint16_t) * desc.numIndices) + .Content(data + orb.IndexDataOffset); + desc.indexType = IndexType::UInt16; + return desc; } //------------------------------------------------------------------------------ @@ -131,7 +149,7 @@ static AnimLibrarySetup makeAnimLibSetup(const OrbFile& orb, const Locator& loc) //------------------------------------------------------------------------------ bool -OrbLoader::Load(const Buffer& data, const StringAtom& name, OrbModel& model) { +OrbLoader::Load(const MemoryBuffer& data, const StringAtom& name, OrbModel& model) { model = OrbModel(); // parse the .orb file @@ -142,8 +160,11 @@ OrbLoader::Load(const Buffer& data, const StringAtom& name, OrbModel& model) { model.VertexMagnitude = glm::vec4(orb.VertexMagnitude, 1.0f); // one mesh for entire model - model.MeshSetup = makeMeshSetup(orb, Locator(name, MeshSignature)); - model.Mesh = Gfx::CreateResource(model.MeshSetup, data.Data(), data.Size()); + auto meshDesc = makeMeshDesc(data.Data(), orb, name); + model.VertexBufferDesc = meshDesc.vertexBufferDesc; + model.IndexBufferDesc = meshDesc.indexBufferDesc; + model.VertexBuffer = Gfx::CreateBuffer(model.VertexBufferDesc); + model.IndexBuffer = Gfx::CreateBuffer(model.IndexBufferDesc); // materials hold shader uniform blocks and textures for (int i = 0; i < orb.Materials.Size(); i++) { @@ -155,7 +176,7 @@ OrbLoader::Load(const Buffer& data, const StringAtom& name, OrbModel& model) { for (int i = 0; i < orb.Meshes.Size(); i++) { OrbModel::Submesh& m = model.Submeshes.Add(); m.MaterialIndex = orb.Meshes[i].Material; - m.PrimitiveGroupIndex = i; + m.PrimGroup = meshDesc.primGroups[i]; } // character stuff diff --git a/src/Common/OrbLoader.h b/src/Common/OrbLoader.h index 60cdcb9..79be1af 100644 --- a/src/Common/OrbLoader.h +++ b/src/Common/OrbLoader.h @@ -5,14 +5,14 @@ @brief load an .orb file into an OrbModel */ #include "Common/OrbModel.h" -#include "Core/Containers/Buffer.h" +#include "Core/Containers/MemoryBuffer.h" namespace Oryol { class OrbLoader { public: /// load .orb file data in Buffer object into OrbModel - static bool Load(const Buffer& data, const StringAtom& name, OrbModel& outModel); + static bool Load(const MemoryBuffer& data, const StringAtom& name, OrbModel& outModel); }; } // namespace Oryol diff --git a/src/Common/OrbModel.h b/src/Common/OrbModel.h index 02d588e..9a85d09 100644 --- a/src/Common/OrbModel.h +++ b/src/Common/OrbModel.h @@ -20,14 +20,16 @@ struct OrbModel { }; struct Submesh { int MaterialIndex = 0; - int PrimitiveGroupIndex = 0; + PrimitiveGroup PrimGroup; bool Visible = false; }; bool IsValid = false; - class MeshSetup MeshSetup; + BufferDesc VertexBufferDesc; + BufferDesc IndexBufferDesc; glm::vec4 VertexMagnitude; - Id Mesh; + Id VertexBuffer; + Id IndexBuffer; Id Skeleton; Id AnimLib; InlineArray Materials; diff --git a/src/Common/Wireframe.cc b/src/Common/Wireframe.cc index ad66fb5..e1d231c 100644 --- a/src/Common/Wireframe.cc +++ b/src/Common/Wireframe.cc @@ -10,27 +10,29 @@ namespace Oryol { //------------------------------------------------------------------------------ void -Wireframe::Setup(const GfxSetup& gfxSetup) { +Wireframe::Setup(const GfxDesc& gfxDesc) { Gfx::PushResourceLabel(); - auto meshSetup = MeshSetup::Empty(MaxNumVertices, Usage::Stream); - meshSetup.Layout = { - { VertexAttr::Position, VertexFormat::Float3 }, - { VertexAttr::Color0, VertexFormat::Float4 } - }; - this->drawState.Mesh[0] = Gfx::CreateResource(meshSetup); + this->drawState.VertexBuffers[0] = Gfx::CreateBuffer(BufferDesc() + .Type(BufferType::VertexBuffer) + .Size(MaxNumVertices * sizeof(Vertex)) + .Usage(Usage::Stream)); - Id shd = Gfx::CreateResource(WireframeShader::Setup()); - auto pipSetup = PipelineSetup::FromLayoutAndShader(meshSetup.Layout, shd); - pipSetup.RasterizerState.SampleCount = gfxSetup.SampleCount; - pipSetup.BlendState.BlendEnabled = true; - pipSetup.BlendState.SrcFactorRGB = BlendFactor::SrcAlpha; - pipSetup.BlendState.SrcFactorAlpha = BlendFactor::Zero; - pipSetup.BlendState.DstFactorRGB = BlendFactor::OneMinusSrcAlpha; - pipSetup.BlendState.DstFactorAlpha = BlendFactor::One; - pipSetup.BlendState.ColorFormat = gfxSetup.ColorFormat; - pipSetup.BlendState.DepthFormat = gfxSetup.DepthFormat; - pipSetup.PrimType = PrimitiveType::Lines; - this->drawState.Pipeline = Gfx::CreateResource(pipSetup); + Id shd = Gfx::CreateShader(WireframeShader::Desc()); + this->drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(shd) + .PrimitiveType(PrimitiveType::Lines) + .Layout(0, { + { "position", VertexFormat::Float3 }, + { "color0", VertexFormat::Float4 } + }) + .BlendEnabled(true) + .BlendSrcFactorRGB(BlendFactor::SrcAlpha) + .BlendDstFactorRGB(BlendFactor::OneMinusSrcAlpha) + .BlendSrcFactorAlpha(BlendFactor::Zero) + .BlendDstFactorAlpha(BlendFactor::One) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); this->label = Gfx::PopResourceLabel(); } @@ -65,12 +67,14 @@ Wireframe::Rect(const glm::vec3& p0, const glm::vec3& p1, const glm::vec3& p2, c void Wireframe::Render() { if (!this->vertices.Empty()) { - Gfx::UpdateVertices(this->drawState.Mesh[0], this->vertices.begin(), this->vertices.Size()*sizeof(Vertex)); + Gfx::UpdateBuffer(this->drawState.VertexBuffers[0], + this->vertices.begin(), + this->vertices.Size()*sizeof(Vertex)); Gfx::ApplyDrawState(this->drawState); WireframeShader::vsParams vsParams; vsParams.viewProj = this->ViewProj; Gfx::ApplyUniformBlock(vsParams); - Gfx::Draw({ 0, this->vertices.Size() }); + Gfx::Draw(0, this->vertices.Size()); this->vertices.Reset(); } } diff --git a/src/Common/Wireframe.h b/src/Common/Wireframe.h index 81146ce..0523af2 100644 --- a/src/Common/Wireframe.h +++ b/src/Common/Wireframe.h @@ -22,7 +22,7 @@ struct Wireframe { glm::vec4 Color = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f); /// setup the debug renderer - void Setup(const GfxSetup& setup); + void Setup(const GfxDesc& gfxDesc); /// discard the debug renderer void Discard(); /// call once before Gfx::CommitFrame to render the debug scene From 4035833440cf0a4b55ded07984061e79de381837 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Mon, 23 Apr 2018 18:42:35 +0200 Subject: [PATCH 03/24] Fix KC85-3 sample --- src/EmuCommon/KC85Emu.cc | 43 +++++++++++----------- src/EmuCommon/KC85Emu.h | 3 +- src/KC85-3/Main.cc | 26 +++++++------- src/KC85-3/RayCheck.cc | 27 +++++++------- src/KC85-3/RayCheck.h | 3 +- src/KC85-3/SceneRenderer.cc | 72 ++++++++++++++++++------------------- src/KC85-3/SceneRenderer.h | 14 ++++---- 7 files changed, 97 insertions(+), 91 deletions(-) diff --git a/src/EmuCommon/KC85Emu.cc b/src/EmuCommon/KC85Emu.cc index ce4ea72..f19660f 100644 --- a/src/EmuCommon/KC85Emu.cc +++ b/src/EmuCommon/KC85Emu.cc @@ -15,7 +15,7 @@ namespace Oryol { //------------------------------------------------------------------------------ void -KC85Emu::Setup(const GfxSetup& gfxSetup, YAKC::system m, os_rom os) { +KC85Emu::Setup(const GfxDesc& gfxDesc, YAKC::system m, os_rom os) { this->model = m; this->rom = os; @@ -31,7 +31,7 @@ KC85Emu::Setup(const GfxSetup& gfxSetup, YAKC::system m, os_rom os) { sys_funcs.malloc_func = [] (size_t s) -> void* { return Memory::Alloc(int(s)); }; sys_funcs.free_func = [] (void* p) { Memory::Free(p); }; this->emu.init(sys_funcs); - this->draw.Setup(gfxSetup, 5, 5); + this->draw.Setup(gfxDesc, 5, 5); this->audio.Setup(&this->emu); this->keyboard.Setup(this->emu); this->fileLoader.Setup(this->emu); @@ -43,21 +43,23 @@ KC85Emu::Setup(const GfxSetup& gfxSetup, YAKC::system m, os_rom os) { } // setup a mesh and draw state to render a simple plane - ShapeBuilder shapeBuilder; - shapeBuilder.Layout - .Add(VertexAttr::Position, VertexFormat::Float3) - .Add(VertexAttr::TexCoord0, VertexFormat::Float2); - shapeBuilder.Plane(1.0f, 1.0f, 1); - this->drawState.Mesh[0] = Gfx::CreateResource(shapeBuilder.Build()); - - Id shd = Gfx::CreateResource(KCShader::Setup()); - auto pip = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, shd); - pip.DepthStencilState.DepthWriteEnabled = true; - pip.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pip.RasterizerState.SampleCount = gfxSetup.SampleCount; - pip.BlendState.ColorFormat = gfxSetup.ColorFormat; - pip.BlendState.DepthFormat = gfxSetup.DepthFormat; - this->drawState.Pipeline = Gfx::CreateResource(pip); + auto shape = ShapeBuilder() + .Positions("position", VertexFormat::Float3) + .TexCoords("texcoord0", VertexFormat::Float2) + .Plane(1.0f, 1.0f, 1) + .Build(); + this->drawState.VertexBuffers[0] = Gfx::CreateBuffer(shape.VertexBufferDesc); + this->drawState.IndexBuffer = Gfx::CreateBuffer(shape.IndexBufferDesc); + this->primGroup = shape.PrimitiveGroups[0]; + + Id shd = Gfx::CreateShader(KCShader::Desc()); + this->drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(shape.PipelineDesc) + .Shader(shd) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); } //------------------------------------------------------------------------------ @@ -159,16 +161,17 @@ KC85Emu::Render(const glm::mat4& mvp, bool onlyUpdateTexture) { const void* fb = this->emu.framebuffer(width, height); if (fb) { this->draw.validateTexture(width, height); - this->draw.texUpdateAttrs.Sizes[0][0] = width*height*4; + this->draw.imageContent.Size[0][0] = width*height*4; + this->draw.imageContent.Pointer[0][0] = fb; if (this->draw.texture.IsValid()) { - Gfx::UpdateTexture(this->draw.texture, fb, this->draw.texUpdateAttrs); + Gfx::UpdateTexture(this->draw.texture, this->draw.imageContent); if (!onlyUpdateTexture) { this->drawState.FSTexture[KCShader::irm] = this->draw.texture; KCShader::vsParams vsParams; vsParams.mvp = mvp; Gfx::ApplyDrawState(this->drawState); Gfx::ApplyUniformBlock(vsParams); - Gfx::Draw(); + Gfx::Draw(this->primGroup); } } } diff --git a/src/EmuCommon/KC85Emu.h b/src/EmuCommon/KC85Emu.h index d5555ea..983166f 100644 --- a/src/EmuCommon/KC85Emu.h +++ b/src/EmuCommon/KC85Emu.h @@ -18,7 +18,7 @@ namespace Oryol { class KC85Emu { public: /// setup the KC85 emulator - void Setup(const GfxSetup& gfxSetup, YAKC::system m=YAKC::system::kc85_3, YAKC::os_rom os=YAKC::os_rom::caos_3_1); + void Setup(const GfxDesc& gfxDesc, YAKC::system m=YAKC::system::kc85_3, YAKC::os_rom os=YAKC::os_rom::caos_3_1); /// discard the KC85 emulator void Discard(); /// tick the emulator @@ -42,6 +42,7 @@ class KC85Emu { uint32_t switchOnDelayFrames = 120; DrawState drawState; + PrimitiveGroup primGroup; YAKC::system model = YAKC::system::kc85_3; YAKC::os_rom rom = YAKC::os_rom::caos_3_1; YAKC::yakc emu; diff --git a/src/KC85-3/Main.cc b/src/KC85-3/Main.cc index ba870af..8ec14af 100644 --- a/src/KC85-3/Main.cc +++ b/src/KC85-3/Main.cc @@ -57,20 +57,18 @@ AppState::Code KC853App::OnInit() { // setup Oryol modules - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("kcc:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); - auto gfxSetup = GfxSetup::WindowMSAA4(800, 512, "Emu"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.4f, 0.6f, 0.8f, 1.0f)); - Gfx::Setup(gfxSetup); + IO::Setup(IODesc() + .Assign("kcc:", ORYOL_SAMPLE_URL) + .FileSystem("http", HTTPFileSystem::Creator())); + auto gfxDesc = GfxDesc().Width(800).Height(512).SampleCount(4).Title("Emu"); + Gfx::Setup(gfxDesc); Input::Setup(); Dbg::Setup(); Dbg::TextScale(2.0f, 2.0f); // setup the scene and ray collide checker - this->scene.Setup(gfxSetup); - this->rayChecker.Setup(gfxSetup); + this->scene.Setup(gfxDesc); + this->rayChecker.Setup(gfxDesc); this->rayChecker.Add(Screen, glm::vec3(51, 15, 39), glm::vec3(78, 36, 42)); this->rayChecker.Add(Junost, glm::vec3(41, 11, 43), glm::vec3(80, 40, 66)); this->rayChecker.Add(PowerOnButton, glm::vec3(45, 2, 38), glm::vec3(50, 6, 42)); @@ -92,7 +90,7 @@ KC853App::OnInit() { this->camera.Orbital = glm::vec2(glm::radians(10.0f), glm::radians(160.0f)); // setup the KC emulator - this->kc85Emu.Setup(gfxSetup); + this->kc85Emu.Setup(gfxDesc); this->lapTime = Clock::Now(); glm::mat4 m = glm::rotate(glm::mat4(1.0f), glm::radians(180.0f), glm::vec3(0.0f, 1.0f, 0.0f)); @@ -114,7 +112,7 @@ KC853App::OnRunning() { this->kc85Emu.Update(Clock::LapTime(this->lapTime)); // render the voxel scene and emulator screen - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.4f, 0.6f, 0.8f, 1.0f)); this->scene.Render(this->camera.ViewProj); this->kc85Emu.Render(this->camera.ViewProj * this->kcModelMatrix); // this->rayChecker.RenderDebug(this->camera.ViewProj); @@ -140,8 +138,8 @@ KC853App::handleInput() { glm::vec2 screenSpaceMousePos = Input::MousePosition(); const bool lmb = Input::MouseButtonDown(MouseButton::Left); const DisplayAttrs& disp = Gfx::DisplayAttrs(); - screenSpaceMousePos.x /= float(disp.FramebufferWidth); - screenSpaceMousePos.y /= float(disp.FramebufferHeight); + screenSpaceMousePos.x /= float(disp.Width); + screenSpaceMousePos.y /= float(disp.Height); glm::mat4 invView = glm::inverse(this->camera.View); int hit = this->rayChecker.Test(screenSpaceMousePos, invView, this->camera.InvProj); switch (hit) { @@ -222,7 +220,7 @@ KC853App::tooltip(const DisplayAttrs& disp, const char* str) { o_assert_dbg(str); // center the text - int center = (disp.FramebufferWidth / 16) / 2; + int center = (disp.Width / 16) / 2; int len = int(std::strlen(str)); int posX = center - (len/2); if (posX < 0) { diff --git a/src/KC85-3/RayCheck.cc b/src/KC85-3/RayCheck.cc index ea38205..8441cea 100644 --- a/src/KC85-3/RayCheck.cc +++ b/src/KC85-3/RayCheck.cc @@ -12,20 +12,23 @@ namespace Oryol { //------------------------------------------------------------------------------ void -RayCheck::Setup(const GfxSetup& gfxSetup) { +RayCheck::Setup(const GfxDesc& gfxDesc) { // setup a debug draw shape - ShapeBuilder shapeBuilder; - shapeBuilder.Layout.Add(VertexAttr::Position, VertexFormat::Float3); - shapeBuilder.Box(1.0f, 1.0f, 1.0f, 1); - this->dbgDrawState.Mesh[0] = Gfx::CreateResource(shapeBuilder.Build()); + auto shape = ShapeBuilder() + .Positions("position", VertexFormat::Float3) + .Box(1.0f, 1.0f, 1.0f, 1) + .Build(); + this->dbgDrawState.VertexBuffers[0] = Gfx::CreateBuffer(shape.VertexBufferDesc); + this->dbgDrawState.IndexBuffer = Gfx::CreateBuffer(shape.IndexBufferDesc); + this->dbgPrimGroup = shape.PrimitiveGroups[0]; - Id shd = Gfx::CreateResource(DbgShader::Setup()); - auto pip = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, shd); - pip.RasterizerState.SampleCount = gfxSetup.SampleCount; - pip.BlendState.ColorFormat = gfxSetup.ColorFormat; - pip.BlendState.DepthFormat = gfxSetup.DepthFormat; - this->dbgDrawState.Pipeline = Gfx::CreateResource(pip); + Id shd = Gfx::CreateShader(DbgShader::Desc()); + this->dbgDrawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(shape.PipelineDesc) + .Shader(shd) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); } //------------------------------------------------------------------------------ @@ -106,7 +109,7 @@ RayCheck::RenderDebug(const glm::mat4& viewProj) { vsParams.color = this->dbgIntersectId == -1 ? red : green; Gfx::ApplyDrawState(this->dbgDrawState); Gfx::ApplyUniformBlock(vsParams); - Gfx::Draw(); + Gfx::Draw(this->dbgPrimGroup); } } // namespace Oryol diff --git a/src/KC85-3/RayCheck.h b/src/KC85-3/RayCheck.h index 46acdf5..d1151c0 100644 --- a/src/KC85-3/RayCheck.h +++ b/src/KC85-3/RayCheck.h @@ -16,7 +16,7 @@ namespace Oryol { class RayCheck { public: /// setup the ray checker - void Setup(const GfxSetup& gfxSetup); + void Setup(const GfxDesc& gfxDesc); /// discard the ray checker void Discard(); @@ -42,6 +42,7 @@ class RayCheck { StaticArray boxes; DrawState dbgDrawState; + PrimitiveGroup dbgPrimGroup; int dbgIntersectId = -1; glm::vec3 dbgMouseRayPos; glm::vec3 dbgMouseRayVec; diff --git a/src/KC85-3/SceneRenderer.cc b/src/KC85-3/SceneRenderer.cc index 6f73437..e960690 100644 --- a/src/KC85-3/SceneRenderer.cc +++ b/src/KC85-3/SceneRenderer.cc @@ -19,15 +19,16 @@ namespace Oryol { //------------------------------------------------------------------------------ void -SceneRenderer::Setup(const GfxSetup& gfxSetup) { +SceneRenderer::Setup(const GfxDesc& gfxDesc) { // setup graphics resources - VertexLayout layout; - layout.Add(VertexAttr::Position, VertexFormat::UByte4N); - layout.Add(VertexAttr::Normal, VertexFormat::UByte4N); - this->indexMesh = this->createIndexMesh(); - this->voxelMeshes = this->createVoxelMeshes(layout); - this->setupDrawState(gfxSetup, layout); + VertexLayout layout = { + { "position", VertexFormat::UByte4N }, + { "normal", VertexFormat::UByte4N } + }; + this->indexBuffer = this->createIndexBuffer(); + this->voxelBuffers = this->createVoxelBuffers(layout); + this->setupDrawState(gfxDesc, layout); this->setupShaderParams(); } @@ -40,29 +41,32 @@ SceneRenderer::Discard() { //------------------------------------------------------------------------------ void SceneRenderer::Render(const glm::mat4& viewProj) { - for (int i = 0; i < voxelMeshes.Size(); i++) { - this->drawState.Mesh[1] = this->voxelMeshes[i].mesh; + for (int i = 0; i < voxelBuffers.Size(); i++) { + this->drawState.VertexBuffers[0] = this->voxelBuffers[i].buffer; this->vsParams.mvp = viewProj; Gfx::ApplyDrawState(this->drawState); Gfx::ApplyUniformBlock(this->vsParams); - Gfx::Draw(PrimitiveGroup(0, this->voxelMeshes[i].numQuads*6)); + Gfx::Draw(0, this->voxelBuffers[i].numQuads*6); } } //------------------------------------------------------------------------------ void -SceneRenderer::setupDrawState(const GfxSetup& gfxSetup, const VertexLayout& layout) { - o_assert(this->indexMesh.IsValid()); - Id shd = Gfx::CreateResource(VoxelShader::Setup()); - auto pip = PipelineSetup::FromShader(shd); - pip.Layouts[1] = layout; // IMPORTANT: vertices are in mesh slot #1, not #0! - pip.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pip.DepthStencilState.DepthWriteEnabled = true; - pip.RasterizerState.CullFaceEnabled = true; - pip.RasterizerState.CullFace = Face::Front; - pip.RasterizerState.SampleCount = gfxSetup.SampleCount; - this->drawState.Pipeline = Gfx::CreateResource(pip); - this->drawState.Mesh[0] = this->indexMesh; +SceneRenderer::setupDrawState(const GfxDesc& gfxDesc, const VertexLayout& layout) { + o_assert(this->indexBuffer.IsValid()); + Id shd = Gfx::CreateShader(VoxelShader::Desc()); + this->drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(shd) + .Layout(0, layout) + .IndexType(IndexType::UInt16) + .DepthCmpFunc(CompareFunc::LessEqual) + .DepthWriteEnabled(true) + .CullFaceEnabled(true) + .CullFace(Face::Front) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); + this->drawState.IndexBuffer = this->indexBuffer; } //------------------------------------------------------------------------------ @@ -94,7 +98,7 @@ SceneRenderer::setupShaderParams() { //------------------------------------------------------------------------------ Id -SceneRenderer::createIndexMesh() { +SceneRenderer::createIndexBuffer() { // creates one big index mesh with the max number of indices to // render one of the voxel meshes uint16_t indices[MaxNumIndices]; @@ -109,18 +113,15 @@ SceneRenderer::createIndexMesh() { indices[ii+5] = baseVertexIndex + 3; } - auto meshSetup = MeshSetup::FromData(Usage::InvalidUsage, Usage::Immutable); - meshSetup.NumVertices = 0; - meshSetup.NumIndices = MaxNumIndices; - meshSetup.IndicesType = IndexType::Index16; - meshSetup.VertexDataOffset = InvalidIndex; - meshSetup.IndexDataOffset = 0; - return Gfx::CreateResource(meshSetup, indices, sizeof(indices)); + return Gfx::CreateBuffer(BufferDesc() + .Type(BufferType::IndexBuffer) + .Size(sizeof(indices)) + .Content(indices)); } //------------------------------------------------------------------------------ Array -SceneRenderer::createVoxelMeshes(const VertexLayout& layout) { +SceneRenderer::createVoxelBuffers(const VertexLayout& layout) { // this creates one or more Oryol meshes from the run-length-encoded // voxel data via stb_voxel_render @@ -169,8 +170,6 @@ SceneRenderer::createVoxelMeshes(const VertexLayout& layout) { desc->lighting = lightBuf; // meshify into Oryol meshes in a loop - auto meshSetup = MeshSetup::FromData(); - meshSetup.Layout = layout; const int vtxBufSize = MaxNumVertices * layout.ByteSize(); void* vtxBuf = Memory::Alloc(vtxBufSize); @@ -182,9 +181,10 @@ SceneRenderer::createVoxelMeshes(const VertexLayout& layout) { int numQuads = stbvox_get_quad_count(&stbvox, 0); if (numQuads > 0) { voxMesh m; - meshSetup.NumVertices = numQuads * 4; - o_assert_dbg(meshSetup.NumVertices <= MaxNumVertices); - m.mesh = Gfx::CreateResource(meshSetup, vtxBuf, vtxBufSize); + m.buffer = Gfx::CreateBuffer(BufferDesc() + .Type(BufferType::VertexBuffer) + .Size(numQuads * 4 * layout.ByteSize()) + .Content(vtxBuf)); m.numQuads = numQuads; result.Add(m); } diff --git a/src/KC85-3/SceneRenderer.h b/src/KC85-3/SceneRenderer.h index b05ff30..d6de048 100644 --- a/src/KC85-3/SceneRenderer.h +++ b/src/KC85-3/SceneRenderer.h @@ -13,7 +13,7 @@ namespace Oryol { class SceneRenderer { public: /// setup the scene renderer - void Setup(const GfxSetup& gfxSetup); + void Setup(const GfxDesc& gfxDesc); /// discard the scene renderer void Discard(); /// render the voxel scene @@ -24,19 +24,19 @@ class SceneRenderer { static const int MaxNumIndices = MaxNumQuads * 6; struct voxMesh { - Id mesh; + Id buffer; int numQuads = 0; }; - Id createIndexMesh(); - Array createVoxelMeshes(const VertexLayout& layout); - void setupDrawState(const GfxSetup& gfxSetup, const VertexLayout& layout); + Id createIndexBuffer(); + Array createVoxelBuffers(const VertexLayout& layout); + void setupDrawState(const GfxDesc& gfxDesc, const VertexLayout& layout); void setupShaderParams(); DrawState drawState; VoxelShader::vsParams vsParams; - Id indexMesh; - Array voxelMeshes; + Id indexBuffer; + Array voxelBuffers; }; } // namespace Oryol From 0c2929b94f91c176acc5a4d243f8c9000884a10f Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Mon, 23 Apr 2018 18:44:57 +0200 Subject: [PATCH 04/24] Fix Metal validation error --- src/KC85-3/Main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KC85-3/Main.cc b/src/KC85-3/Main.cc index 8ec14af..c82d23e 100644 --- a/src/KC85-3/Main.cc +++ b/src/KC85-3/Main.cc @@ -63,7 +63,7 @@ KC853App::OnInit() { auto gfxDesc = GfxDesc().Width(800).Height(512).SampleCount(4).Title("Emu"); Gfx::Setup(gfxDesc); Input::Setup(); - Dbg::Setup(); + Dbg::Setup(DbgDesc().SampleCount(4)); Dbg::TextScale(2.0f, 2.0f); // setup the scene and ray collide checker From 37c1e7ebfad188ee56b1d00dc5cca89343238ffc Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 10:55:21 +0200 Subject: [PATCH 05/24] Fix TurboBadgerDemo --- src/TurboBadgerDemo/TurboBadgerDemo.cc | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/TurboBadgerDemo/TurboBadgerDemo.cc b/src/TurboBadgerDemo/TurboBadgerDemo.cc index c41777e..f05284f 100644 --- a/src/TurboBadgerDemo/TurboBadgerDemo.cc +++ b/src/TurboBadgerDemo/TurboBadgerDemo.cc @@ -58,15 +58,12 @@ const char *boy_names[] = { AppState::Code TurboBadgerDemoApp::OnInit() { - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("res:", ORYOL_SAMPLE_URL); - ioSetup.Assigns.Add("ui:", "res:tbui/"); - IO::Setup(ioSetup); - - auto gfxSetup = GfxSetup::Window(1000, 650, "TurboBadger UI Demo"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.5f, 0.0f, 1.0f, 1.0f)); - Gfx::Setup(gfxSetup); + IO::Setup(IODesc() + .FileSystem("http", HTTPFileSystem::Creator()) + .Assign("res:", ORYOL_SAMPLE_URL) + .Assign("ui:", "res:tbui/")); + + Gfx::Setup(GfxDesc().Width(1000).Height(650).Title("TurboBadger UI Demo")); Dbg::Setup(); Input::Setup(); @@ -135,7 +132,7 @@ TurboBadgerDemoApp::OnInit() { AppState::Code TurboBadgerDemoApp::OnRunning() { - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.5f, 0.0f, 1.0f, 1.0f)); TBUI::Draw(); Dbg::DrawTextBuffer(); Gfx::EndPass(); From 8af80cfcb04e7dda4890cde02cffa0b6b7dbf767 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 15:00:50 +0200 Subject: [PATCH 06/24] fix Nuklear UI samples --- src/NuklearUIAdvanced/NuklearUIAdvanced.cc | 39 +++++++++++----------- src/NuklearUIBasic/NuklearUIBasic.cc | 6 ++-- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/NuklearUIAdvanced/NuklearUIAdvanced.cc b/src/NuklearUIAdvanced/NuklearUIAdvanced.cc index fd96b15..5de3c66 100644 --- a/src/NuklearUIAdvanced/NuklearUIAdvanced.cc +++ b/src/NuklearUIAdvanced/NuklearUIAdvanced.cc @@ -31,7 +31,7 @@ class DemoApp : public App { void load_icon(const char* url, struct nk_image* img); bool fontValid = false; - Buffer ttfData; + MemoryBuffer ttfData; }; OryolMain(DemoApp); @@ -73,34 +73,35 @@ DemoApp::load_icon(const char* url, struct nk_image* img) { // decode the PNG data via stb_image int w = 0, h = 0, n = 0; uint8_t* imgData = stbi_load_from_memory(loadResult.Data.Data(), loadResult.Data.Size(), &w, &h, &n, 0); + const int imgDataSize = w * h * PixelFormat::ByteSize(PixelFormat::RGBA8); // create an Oryol texture from the loaded data - auto texSetup = TextureSetup::FromPixelData2D(w, h, 1, PixelFormat::RGBA8); - // hmm... no mipmaps will not look good - texSetup.Sampler.MinFilter = TextureFilterMode::Linear; - texSetup.Sampler.MagFilter = TextureFilterMode::Linear; - texSetup.Sampler.WrapU = TextureWrapMode::ClampToEdge; - texSetup.Sampler.WrapV = TextureWrapMode::ClampToEdge; - const int imgDataSize = w * h * PixelFormat::ByteSize(PixelFormat::RGBA8); - texSetup.ImageData.Sizes[0][0] = imgDataSize; - Id texId = Gfx::CreateResource(texSetup, imgData, imgDataSize); + Id tex = Gfx::CreateTexture(TextureDesc() + .Type(TextureType::Texture2D) + .Width(w) + .Height(h) + .NumMipMaps(1) + .Format(PixelFormat::RGBA8) + .MinFilter(TextureFilterMode::Linear) + .MagFilter(TextureFilterMode::Linear) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge) + .MipSize(0, 0, imgDataSize) + .MipContent(0, 0, imgData)); stbi_image_free(imgData); // ...and associate the Oryol texture with the Nuklear image handle - NKUI::BindImage(*img, texId); + NKUI::BindImage(*img, tex); }); } //------------------------------------------------------------------------------ AppState::Code DemoApp::OnInit() { - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("data:", ORYOL_SAMPLE_URL "nkui/"); - IO::Setup(ioSetup); - auto gfxSetup = GfxSetup::Window(1024, 700, "Basic Nuklear UI Demo"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.25f, 0.25f, 0.75f, 1.0f)); - Gfx::Setup(gfxSetup); + IO::Setup(IODesc() + .Assign("data:", ORYOL_SAMPLE_URL "nkui/") + .FileSystem("http", HTTPFileSystem::Creator())); + Gfx::Setup(GfxDesc().Width(1027).Height(700).Title("Advanced Nuklear UI Demo")); Input::Setup(); NKUI::Setup(); Memory::Clear(&media, sizeof(media)); @@ -157,7 +158,7 @@ DemoApp::OnInit() { //------------------------------------------------------------------------------ AppState::Code DemoApp::OnRunning() { - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.25f, 0.25f, 0.25f, 1.0f)); if (this->fontValid) { nk_context* ctx = NKUI::NewFrame(); button_demo(ctx, &media); diff --git a/src/NuklearUIBasic/NuklearUIBasic.cc b/src/NuklearUIBasic/NuklearUIBasic.cc index 5b8dacb..8a28678 100644 --- a/src/NuklearUIBasic/NuklearUIBasic.cc +++ b/src/NuklearUIBasic/NuklearUIBasic.cc @@ -29,9 +29,7 @@ OryolMain(DemoApp); //------------------------------------------------------------------------------ AppState::Code DemoApp::OnInit() { - auto gfxSetup = GfxSetup::Window(1024, 700, "Basic Nuklear UI Demo"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.25f, 0.25f, 0.75f, 1.0f)); - Gfx::Setup(gfxSetup); + Gfx::Setup(GfxDesc().Width(1024).Height(700).Title("Basic Nuklear UI Demo")); Input::Setup(); NKUI::Setup(); return AppState::Running; @@ -40,7 +38,7 @@ DemoApp::OnInit() { //------------------------------------------------------------------------------ AppState::Code DemoApp::OnRunning() { - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.25f, 0.25f, 0.75f, 1.0f)); nk_context* ctx = NKUI::NewFrame(); drawOverviewWindow(ctx); NKUI::Draw(); From 057b1e3bd58437be868f79fd152f751e1098ce32 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 15:45:09 +0200 Subject: [PATCH 07/24] Fix StbVoxelDemo --- src/StbVoxelDemo/GeomPool.cc | 50 +++++++++++++++++++----------------- src/StbVoxelDemo/GeomPool.h | 6 ++--- src/StbVoxelDemo/Main.cc | 27 ++++++++++--------- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/src/StbVoxelDemo/GeomPool.cc b/src/StbVoxelDemo/GeomPool.cc index 2350f57..c0bbfd9 100644 --- a/src/StbVoxelDemo/GeomPool.cc +++ b/src/StbVoxelDemo/GeomPool.cc @@ -12,7 +12,7 @@ using namespace Oryol; //------------------------------------------------------------------------------ void -GeomPool::Setup(const GfxSetup& gfxSetup) { +GeomPool::Setup(const GfxDesc& gfxDesc) { // setup a static mesh with only indices which is shared by all geom meshes uint16_t indices[Config::GeomMaxNumIndices]; @@ -26,13 +26,10 @@ GeomPool::Setup(const GfxSetup& gfxSetup) { indices[ii+4] = baseVertexIndex + 2; indices[ii+5] = baseVertexIndex + 3; } - auto meshSetup = MeshSetup::FromData(Usage::InvalidUsage, Usage::Immutable); - meshSetup.NumVertices = 0; - meshSetup.NumIndices = Config::GeomMaxNumIndices; - meshSetup.IndicesType = IndexType::Index16; - meshSetup.VertexDataOffset = InvalidIndex; - meshSetup.IndexDataOffset = 0; - this->IndexMesh = Gfx::CreateResource(meshSetup, indices, sizeof(indices)); + this->IndexBuffer = Gfx::CreateBuffer(BufferDesc() + .Type(BufferType::IndexBuffer) + .Size(sizeof(indices)) + .Content(indices)); // setup shader params template Shader::vsParams vsParams; @@ -47,25 +44,32 @@ GeomPool::Setup(const GfxSetup& gfxSetup) { } // setup shader and drawstate - Id shd = Gfx::CreateResource(Shader::Setup()); - auto pips = PipelineSetup::FromShader(shd); - pips.Layouts[1] - .Add(VertexAttr::Position, VertexFormat::UByte4N) - .Add(VertexAttr::Normal, VertexFormat::UByte4N); - pips.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pips.DepthStencilState.DepthWriteEnabled = true; - pips.RasterizerState.CullFaceEnabled = true; - pips.RasterizerState.CullFace = Face::Front; - pips.RasterizerState.SampleCount = gfxSetup.SampleCount; - this->Pipeline = Gfx::CreateResource(pips); + Id shd = Gfx::CreateShader(Shader::Desc()); + VertexLayout layout = { + { "position", VertexFormat::UByte4N }, + { "normal", VertexFormat::UByte4N } + }; + this->Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(shd) + .IndexType(IndexType::UInt16) + .Layout(0, layout) + .DepthCmpFunc(CompareFunc::LessEqual) + .DepthWriteEnabled(true) + .CullFaceEnabled(true) + .CullFace(Face::Front) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); // setup items - meshSetup = MeshSetup::Empty(Config::GeomMaxNumVertices, Usage::Dynamic); - meshSetup.Layout = pips.Layouts[1]; + auto vbufDesc = BufferDesc() + .Type(BufferType::VertexBuffer) + .Usage(Usage::Dynamic) + .Size(Config::GeomMaxNumVertices * layout.ByteSize()); for (auto& geom : this->Geoms) { geom.VSParams = vsParams; geom.NumQuads = 0; - geom.Mesh = Gfx::CreateResource(meshSetup); + geom.VertexBuffer = Gfx::CreateBuffer(vbufDesc); } this->freeGeoms.Reserve(NumGeoms); this->FreeAll(); @@ -74,7 +78,7 @@ GeomPool::Setup(const GfxSetup& gfxSetup) { //------------------------------------------------------------------------------ void GeomPool::Discard() { - this->IndexMesh.Invalidate(); + this->IndexBuffer.Invalidate(); this->Pipeline.Invalidate(); this->freeGeoms.Clear(); } diff --git a/src/StbVoxelDemo/GeomPool.h b/src/StbVoxelDemo/GeomPool.h index 075d3e9..9a26611 100644 --- a/src/StbVoxelDemo/GeomPool.h +++ b/src/StbVoxelDemo/GeomPool.h @@ -13,7 +13,7 @@ class GeomPool { public: /// initialize the geom pool - void Setup(const Oryol::GfxSetup& gfxSetup); + void Setup(const Oryol::GfxDesc& gfxDesc); /// discard the geom pool void Discard(); @@ -24,10 +24,10 @@ class GeomPool { /// free all geoms void FreeAll(); - Oryol::Id IndexMesh; + Oryol::Id IndexBuffer; Oryol::Id Pipeline; struct Geom { - Oryol::Id Mesh; + Oryol::Id VertexBuffer; int NumQuads = 0; Shader::vsParams VSParams; }; diff --git a/src/StbVoxelDemo/Main.cc b/src/StbVoxelDemo/Main.cc index 8685319..cce789e 100644 --- a/src/StbVoxelDemo/Main.cc +++ b/src/StbVoxelDemo/Main.cc @@ -44,11 +44,14 @@ OryolMain(VoxelTest); //------------------------------------------------------------------------------ AppState::Code VoxelTest::OnInit() { - auto gfxSetup = GfxSetup::WindowMSAA4(800, 600, "Oryol Voxel Test"); - gfxSetup.ResourcePoolSize[GfxResourceType::Pipeline] = 1024; - gfxSetup.ResourcePoolSize[GfxResourceType::Mesh] = 1024; - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.2f, 0.2f, 0.5f, 1.0f)); - Gfx::Setup(gfxSetup); + auto gfxDesc = GfxDesc() + .Width(800) + .Height(600) + .SampleCount(4) + .Title("Oryol Voxel Test") + .ResourcePoolSize(GfxResourceType::Pipeline, 1024) + .ResourcePoolSize(GfxResourceType::Buffer, 1024); + Gfx::Setup(gfxDesc); Input::Setup(); Input::SetPointerLockHandler([](const InputEvent& event) -> PointerLockMode::Code { // switch pointer-lock on/off on left-mouse-button @@ -64,12 +67,12 @@ VoxelTest::OnInit() { }); Dbg::Setup(); - const float fbWidth = (const float) Gfx::DisplayAttrs().FramebufferWidth; - const float fbHeight = (const float) Gfx::DisplayAttrs().FramebufferHeight; + const float fbWidth = (const float) Gfx::DisplayAttrs().Width; + const float fbHeight = (const float) Gfx::DisplayAttrs().Height; this->camera.Setup(glm::vec3(4096, 128, 4096), glm::radians(45.0f), fbWidth, fbHeight, 0.1f, 10000.0f); this->lightDir = glm::normalize(glm::vec3(0.5f, 1.0f, 0.25f)); - this->geomPool.Setup(gfxSetup); + this->geomPool.Setup(gfxDesc); this->geomMesher.Setup(); // use a fixed display width, otherwise the geom pool could // run out of items at high resolutions @@ -85,7 +88,7 @@ VoxelTest::bake_geom(const GeomMesher::Result& meshResult) { if (meshResult.NumQuads > 0) { int geomIndex = this->geomPool.Alloc(); auto& geom = this->geomPool.Geoms[geomIndex]; - Gfx::UpdateVertices(geom.Mesh, meshResult.Vertices, meshResult.NumBytes); + Gfx::UpdateBuffer(geom.VertexBuffer, meshResult.Vertices, meshResult.NumBytes); geom.NumQuads = meshResult.NumQuads; geom.VSParams.model = glm::mat4(); geom.VSParams.light_dir = this->lightDir; @@ -143,19 +146,19 @@ VoxelTest::OnRunning() { } // render visible geoms - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.2f, 0.5f, 1.0f)); const int numDrawNodes = this->visTree.drawNodes.Size(); int numQuads = 0; int numGeoms = 0; DrawState drawState; - drawState.Mesh[0] = this->geomPool.IndexMesh; + drawState.IndexBuffer = this->geomPool.IndexBuffer; drawState.Pipeline = this->geomPool.Pipeline; for (int i = 0; i < numDrawNodes; i++) { const VisNode& node = this->visTree.NodeAt(this->visTree.drawNodes[i]); for (int geomIndex = 0; geomIndex < VisNode::NumGeoms; geomIndex++) { if (node.geoms[geomIndex] >= 0) { auto& geom = this->geomPool.Geoms[node.geoms[geomIndex]]; - drawState.Mesh[1] = geom.Mesh; + drawState.VertexBuffers[0] = geom.VertexBuffer; geom.VSParams.mvp = this->camera.ViewProj; Gfx::ApplyDrawState(drawState); Gfx::ApplyUniformBlock(geom.VSParams); From a6d204798ca18255b41db16b8aa46b9fb73e884f Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 18:37:12 +0200 Subject: [PATCH 08/24] Fix Fractal sample --- src/Fractal/CMakeLists.txt | 2 +- src/Fractal/Fractal.cc | 89 +++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/Fractal/CMakeLists.txt b/src/Fractal/CMakeLists.txt index fe270da..1f36c97 100644 --- a/src/Fractal/CMakeLists.txt +++ b/src/Fractal/CMakeLists.txt @@ -2,6 +2,6 @@ fips_begin_app(Fractal windowed) fips_vs_warning_level(3) fips_files(Fractal.cc) oryol_shader(shaders.shd) - fips_deps(Gfx Input IMUI) + fips_deps(Gfx Assets Input IMUI) oryol_add_web_sample(Fractal "Simple fractal explorer" "emscripten" "Fractal.jpg" "Fractal/Fractal.cc") fips_end_app() diff --git a/src/Fractal/Fractal.cc b/src/Fractal/Fractal.cc index d44da8a..d73a1e8 100644 --- a/src/Fractal/Fractal.cc +++ b/src/Fractal/Fractal.cc @@ -6,6 +6,7 @@ #include "Gfx/Gfx.h" #include "Input/Input.h" #include "IMUI/IMUI.h" +#include "Assets/Gfx/FullscreenQuadBuilder.h" #include "glm/glm.hpp" #include "glm/gtc/constants.hpp" #include "shaders.h" @@ -73,9 +74,9 @@ FractalApp::OnRunning() { // reset current fractal state if requested if (this->clearFlag) { this->clearFlag = false; - Gfx::BeginPass(offscreenPass[0], PassAction::Clear(glm::vec4(0.0f))); + Gfx::BeginPass(offscreenPass[0], PassAction().Clear(0.0f, 0.0f, 0.0f, 0.0f)); Gfx::EndPass(); - Gfx::BeginPass(offscreenPass[1], PassAction::Clear(glm::vec4(0.0f))); + Gfx::BeginPass(offscreenPass[1], PassAction().Clear(0.0f, 0.0f, 0.0f, 0.0f)); Gfx::EndPass(); } @@ -86,7 +87,7 @@ FractalApp::OnRunning() { const Id& curTexture = this->offscreenRenderTarget[index1]; // render next fractal iteration - Gfx::BeginPass(curPass, PassAction::Load()); + Gfx::BeginPass(curPass, PassAction().Load()); if (Mandelbrot == this->fractalType) { this->mandelbrot.drawState.FSTexture[Mandelbrot::tex] = curTexture; Gfx::ApplyDrawState(this->mandelbrot.drawState); @@ -98,15 +99,15 @@ FractalApp::OnRunning() { Gfx::ApplyUniformBlock(this->julia.vsParams); Gfx::ApplyUniformBlock(this->julia.fsParams); } - Gfx::Draw(); + Gfx::Draw(0, 4); Gfx::EndPass(); // map fractal state to display - Gfx::BeginPass(PassAction::DontCare()); + Gfx::BeginPass(PassAction().DontCare()); this->dispDrawState.FSTexture[DisplayShader::tex] = this->offscreenRenderTarget[index0]; Gfx::ApplyDrawState(this->dispDrawState); Gfx::ApplyUniformBlock(this->dispFSParams); - Gfx::Draw(); + Gfx::Draw(0, 4); this->drawUI(); Gfx::EndPass(); @@ -119,7 +120,7 @@ FractalApp::OnRunning() { //------------------------------------------------------------------------------ AppState::Code FractalApp::OnInit() { - Gfx::Setup(GfxSetup::Window(800, 512, "Fractal Sample")); + Gfx::Setup(GfxDesc().Width(800).Height(512).Title("Fractal Sample")); Gfx::Subscribe([this](const GfxEvent& event) { if (event.Type == GfxEvent::DisplayModified) { this->recreateRenderTargets(event.DisplayAttrs); @@ -138,41 +139,36 @@ FractalApp::OnInit() { style.Colors[ImGuiCol_Button] = grey; // a fullscreen quad mesh that's reused several times - auto fsqSetup = MeshSetup::FullScreenQuad(Gfx::QueryFeature(GfxFeature::OriginTopLeft)); - Id fsq = Gfx::CreateResource(fsqSetup); - this->mandelbrot.drawState.Mesh[0] = fsq; - this->julia.drawState.Mesh[0] = fsq; - fsqSetup = MeshSetup::FullScreenQuad(true); - this->dispDrawState.Mesh[0] = Gfx::CreateResource(fsqSetup); + auto fsqOffscreen = FullscreenQuadBuilder() + .FlipV(Gfx::QueryFeature(GfxFeature::OriginTopLeft)) + .Build(); + Id fsqBuf = Gfx::CreateBuffer(BufferDesc(fsqOffscreen.VertexBufferDesc)); + this->mandelbrot.drawState.VertexBuffers[0] = fsqBuf; + this->julia.drawState.VertexBuffers[0] = fsqBuf; + auto fsqDisplay = FullscreenQuadBuilder().FlipV(true).Build(); + this->dispDrawState.VertexBuffers[0] = Gfx::CreateBuffer(fsqDisplay.VertexBufferDesc); // draw state for rendering the final result to screen - Id shd = Gfx::CreateResource(DisplayShader::Setup()); - auto ps = PipelineSetup::FromLayoutAndShader(fsqSetup.Layout, shd); - ps.RasterizerState.CullFaceEnabled = false; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::Always; - this->dispDrawState.Pipeline = Gfx::CreateResource(ps); + Id shd = Gfx::CreateShader(DisplayShader::Desc()); + this->dispDrawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(fsqDisplay.PipelineDesc).Shader(shd)); // setup 2 ping-poing fp32 render targets which hold the current fractal state, // and the texture blocks which use reference these render targets this->recreateRenderTargets(Gfx::DisplayAttrs()); // setup mandelbrot state - shd = Gfx::CreateResource(Mandelbrot::Setup()); - ps = PipelineSetup::FromLayoutAndShader(fsqSetup.Layout, shd); - ps.RasterizerState.CullFaceEnabled = false; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::Always; - ps.BlendState.ColorFormat = PixelFormat::RGBA32F; - ps.BlendState.DepthFormat = PixelFormat::None; - this->mandelbrot.drawState.Pipeline = Gfx::CreateResource(ps); + shd = Gfx::CreateShader(Mandelbrot::Desc()); + this->mandelbrot.drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(fsqOffscreen.PipelineDesc) + .Shader(shd) + .ColorFormat(PixelFormat::RGBA32F) + .DepthFormat(PixelFormat::None)); // setup julia state - shd = Gfx::CreateResource(Julia::Setup()); - ps = PipelineSetup::FromLayoutAndShader(fsqSetup.Layout, shd); - ps.RasterizerState.CullFaceEnabled = false; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::Always; - ps.BlendState.ColorFormat = PixelFormat::RGBA32F; - ps.BlendState.DepthFormat = PixelFormat::None; - this->julia.drawState.Pipeline = Gfx::CreateResource(ps); + shd = Gfx::CreateShader(Julia::Desc()); + this->julia.drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(fsqOffscreen.PipelineDesc) + .Shader(shd) + .ColorFormat(PixelFormat::RGBA32F) + .DepthFormat(PixelFormat::None)); // initialize fractal states this->reset(); @@ -193,8 +189,8 @@ FractalApp::OnCleanup() { void FractalApp::drawUI() { const DisplayAttrs& dispAttrs = Gfx::DisplayAttrs(); - const float fbWidth = (float) dispAttrs.FramebufferWidth; - const float fbHeight = (float) dispAttrs.FramebufferHeight; + const float fbWidth = (float) dispAttrs.Width; + const float fbHeight = (float) dispAttrs.Height; this->clearFlag = false; ImVec2 mousePos = ImGui::GetMousePos(); @@ -250,7 +246,7 @@ FractalApp::drawUI() { } // handle dragging - if (!ImGui::IsMouseHoveringAnyWindow() && ImGui::IsMouseClicked(0)) { + if (!ImGui::GetIO().WantCaptureMouse && ImGui::IsMouseClicked(0)) { this->dragStarted = true; this->dragStartPos = ImGui::GetMousePos(); } @@ -324,8 +320,8 @@ glm::vec2 FractalApp::convertPos(float x, float y, const glm::vec4& bounds) const { // convert mouse pos to fractal real/imaginary pos const DisplayAttrs& attrs = Gfx::DisplayAttrs(); - const float fbWidth = (float) attrs.FramebufferWidth; - const float fbHeight = (float) attrs.FramebufferHeight; + const float fbWidth = (float) attrs.Width; + const float fbHeight = (float) attrs.Height; glm::vec2 rel = glm::vec2(x, y) / glm::vec2(fbWidth, fbHeight); return glm::vec2(bounds.x + ((bounds.z - bounds.x) * rel.x), bounds.y + ((bounds.w - bounds.y) * rel.y)); @@ -361,15 +357,18 @@ FractalApp::recreateRenderTargets(const DisplayAttrs& attrs) { Gfx::DestroyResources(this->offscreenLabel); } this->offscreenLabel = Gfx::PushResourceLabel(); - auto offscreenRTSetup = TextureSetup::RenderTarget2D( - attrs.FramebufferWidth, attrs.FramebufferHeight, - PixelFormat::RGBA32F, PixelFormat::None); - offscreenRTSetup.Sampler.MinFilter = TextureFilterMode::Nearest; - offscreenRTSetup.Sampler.MagFilter = TextureFilterMode::Nearest; + auto offscreenRTDesc = TextureDesc() + .RenderTarget(true) + .Type(TextureType::Texture2D) + .Width(attrs.Width) + .Height(attrs.Height) + .Format(PixelFormat::RGBA32F) + .MinFilter(TextureFilterMode::Nearest) + .MagFilter(TextureFilterMode::Nearest); for (int i = 0; i < 2; i++) { - this->offscreenRenderTarget[i] = Gfx::CreateResource(offscreenRTSetup); - auto passSetup = PassSetup::From(this->offscreenRenderTarget[i]); - this->offscreenPass[i] = Gfx::CreateResource(passSetup); + this->offscreenRenderTarget[i] = Gfx::CreateTexture(offscreenRTDesc); + this->offscreenPass[i] = Gfx::CreatePass(PassDesc() + .ColorAttachment(0, this->offscreenRenderTarget[i])); } this->clearFlag = true; From ce4bf33bb9d231586e12f7e74ab1f6c3c4f7b4b2 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 18:38:18 +0200 Subject: [PATCH 09/24] Remove the obsolete ImGuiAdvanced demo --- src/CMakeLists.txt | 1 - src/ImGuiAdvanced/CMakeLists.txt | 8 - src/ImGuiAdvanced/ImGuiAdvanced.cc | 289 - src/ImGuiAdvanced/ImGuiAdvanced.jpg | Bin 51839 -> 0 bytes src/ImGuiAdvanced/font.cc | 33983 ------------------------- src/ImGuiAdvanced/font.h | 7 - src/ImGuiAdvanced/font.ttf | Bin 28464 -> 0 bytes src/ImGuiAdvanced/font.yml | 4 - src/ImGuiAdvanced/font_license.txt | 201 - src/ImGuiAdvanced/roboto_regular.ttf | Bin 515100 -> 0 bytes src/ImGuiAdvanced/scene_shaders.shd | 21 - 11 files changed, 34514 deletions(-) delete mode 100644 src/ImGuiAdvanced/CMakeLists.txt delete mode 100644 src/ImGuiAdvanced/ImGuiAdvanced.cc delete mode 100644 src/ImGuiAdvanced/ImGuiAdvanced.jpg delete mode 100644 src/ImGuiAdvanced/font.cc delete mode 100644 src/ImGuiAdvanced/font.h delete mode 100644 src/ImGuiAdvanced/font.ttf delete mode 100644 src/ImGuiAdvanced/font.yml delete mode 100644 src/ImGuiAdvanced/font_license.txt delete mode 100644 src/ImGuiAdvanced/roboto_regular.ttf delete mode 100644 src/ImGuiAdvanced/scene_shaders.shd diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5580b4d..d1b148e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,7 +8,6 @@ fips_add_subdirectory(Paclone) fips_add_subdirectory(StbVoxelDemo) fips_add_subdirectory(TurboBadgerDemo) fips_add_subdirectory(ImGuiDemo) -#fips_add_subdirectory(ImGuiAdvanced) fips_add_subdirectory(NuklearUIBasic) fips_add_subdirectory(NuklearUIAdvanced) fips_add_subdirectory(Fractal) diff --git a/src/ImGuiAdvanced/CMakeLists.txt b/src/ImGuiAdvanced/CMakeLists.txt deleted file mode 100644 index fb01715..0000000 --- a/src/ImGuiAdvanced/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -fips_begin_app(ImGuiAdvanced windowed) - fips_vs_warning_level(3) - fips_files(ImGuiAdvanced.cc) - fips_generate(FROM font.yml TYPE dumpbin) - fips_deps(Gfx Assets IMUI EmuCommon) - oryol_shader(scene_shaders.shd) - oryol_add_web_sample(ImGuiAdvanced "ImGui with fonts and images" "emscripten" "ImGuiAdvanced.jpg" "ImGuiAdvanced/ImGuiAdvanced.cc") -fips_end_app() diff --git a/src/ImGuiAdvanced/ImGuiAdvanced.cc b/src/ImGuiAdvanced/ImGuiAdvanced.cc deleted file mode 100644 index da6f73a..0000000 --- a/src/ImGuiAdvanced/ImGuiAdvanced.cc +++ /dev/null @@ -1,289 +0,0 @@ -//------------------------------------------------------------------------------ -// ImGuiAdvanced.cc -//------------------------------------------------------------------------------ -#include "Pre.h" -#include "Core/Main.h" -#include "Gfx/Gfx.h" -#include "Input/Input.h" -#include "IMUI/IMUI.h" -#include "IO/IO.h" -#include "Assets/Gfx/ShapeBuilder.h" -#include "Core/Time/Clock.h" -#include "EmuCommon/KC85Emu.h" -#include "font.h" -#include "scene_shaders.h" -#include "glm/mat4x4.hpp" -#include "glm/gtc/matrix_transform.hpp" - -using namespace Oryol; - -class ImguiAdvancedApp : public App { -public: - virtual AppState::Code OnInit(); - virtual AppState::Code OnRunning(); - virtual AppState::Code OnCleanup(); - void setupImguiStyle(); - - TimePoint lapTime; - - // the 3D scene, render a bunch of shapes to an offscreen render target - struct scene_t { - void setup(const GfxSetup& gfxSetup); - void render(); - glm::mat4 computeMVP(const glm::vec3& pos); - - Id renderTarget; - ClearState clearState = ClearState::ClearAll(glm::vec4(0.25f, 0.45f, 0.65f, 1.0f)); - DrawState drawState; - SceneShader::Params params; - glm::mat4 view; - glm::mat4 proj; - float angleX = 0.0f; - float angleY = 0.0f; - - ImTextureID imguiTexId = nullptr; - } scene; - - // state for the 3 emulators - struct emu_t { - void setup(const GfxSetup& gfxSetup); - void render(Duration frameTime); - enum { - KC85_3 = 0, - KC85_4 = 1, - KC87 = 2, - NumEmus, - }; - KC85Emu kc[NumEmus]; - ImTextureID imgId[NumEmus]; - } emu; -}; -OryolMain(ImguiAdvancedApp); - -// initial emulator window position, size and title -struct { float x, y, w, h; const char* title; } winAttrs[ImguiAdvancedApp::emu_t::NumEmus] = { - { 400.0f, 10.0f, 360.0f, 340.0f, "KC85/3 EMULATOR" }, - { 10.0f, 340.0f, 360.0f, 340.0f, "KC85/4 EMULATOR" }, - { 400.0f, 360.0f, 360.0f, 280.0f, "KC87 EMULATOR" }, -}; - -//------------------------------------------------------------------------------ -AppState::Code -ImguiAdvancedApp::OnInit() { - auto gfxSetup = GfxSetup::Window(800, 680, "Oryol ImGui Advanced"); - Gfx::Setup(gfxSetup); - Input::Setup(); - - // add custom fonts which have been embedded as C arrays - IMUISetup uiSetup; - uiSetup.AddFontFromMemory(dump_roboto_regular, sizeof(dump_roboto_regular), 18.0f); - uiSetup.AddFontFromMemory(dump_font, sizeof(dump_font), 18.0f); - IMUI::Setup(uiSetup); - // tweak y offset of the retro-future-font - IMUI::Font(1)->DisplayOffset.y += 1; - this->setupImguiStyle(); - - // initialize the 3D scene and emulators - this->scene.setup(gfxSetup); - this->emu.setup(gfxSetup); - this->lapTime = Clock::Now(); - - return AppState::Running; -} - -//------------------------------------------------------------------------------ -AppState::Code -ImguiAdvancedApp::OnRunning() { - - // update offscreen render targets - Duration frameTime = Clock::LapTime(this->lapTime); - this->scene.render(); - this->emu.render(frameTime); - - // render the UI, with TTF fonts and Oryol textures as ImGui images - Gfx::ApplyDefaultRenderTarget(ClearState::ClearAll(glm::vec4(0.25f, 0.45f, 0.75f, 1.0f))); - IMUI::NewFrame(); - { - // a window with offscreen-rendered 3D scene - ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiSetCond_Once); - ImGui::SetNextWindowSize(ImVec2(340,300), ImGuiSetCond_FirstUseEver); - ImGui::PushFont(IMUI::Font(0)); - ImGui::Begin("PackedNormals Demo", nullptr, ImGuiWindowFlags_NoResize); - ImGui::Image(this->scene.imguiTexId, ImVec2(320, 256)); - ImGui::End(); - ImGui::PopFont(); - - // emulator windows - for (int i = 0; i < emu_t::NumEmus; i++) { - const auto& attrs = winAttrs[i]; - ImGui::SetNextWindowPos(ImVec2(attrs.x, attrs.y), ImGuiSetCond_FirstUseEver); - ImGui::SetNextWindowSize(ImVec2(attrs.w, attrs.h), ImGuiSetCond_FirstUseEver); - ImGui::PushFont(IMUI::Font(1)); - ImGui::Begin(attrs.title, nullptr); - ImVec2 imgSize = ImGui::GetContentRegionAvail(); - imgSize.y -= ImGui::GetTextLineHeight(); - ImGui::Image(this->emu.imgId[i], imgSize); - ImGui::PushFont(nullptr); - if (ImGui::Button("On/Off")) { - this->emu.kc[i].TogglePower(); - this->emu.kc[i].TogglePower(); - } - ImGui::SameLine(); - if (ImGui::Button("Reset")) { - this->emu.kc[i].Reset(); - } - ImGui::PopFont(); - if (ImGui::IsWindowFocused()) { - for (int j = 0; j < emu_t::NumEmus; j++) { - this->emu.kc[j].keyboard.hasInputFocus = (i == j); - } - } - ImGui::End(); - ImGui::PopFont(); - } - } - ImGui::Render(); - Gfx::CommitFrame(); - return Gfx::QuitRequested() ? AppState::Cleanup : AppState::Running; -} - -//------------------------------------------------------------------------------ -AppState::Code -ImguiAdvancedApp::OnCleanup() { - for (auto& kc : this->emu.kc) { - kc.Discard(); - } - IMUI::Discard(); - Input::Discard(); - Gfx::Discard(); - return App::OnCleanup(); -} - -//------------------------------------------------------------------------------ -void -ImguiAdvancedApp::scene_t::setup(const GfxSetup& gfxSetup) { - - // create an offscreen render target - auto rtSetup = TextureSetup::RenderTarget(320, 256); - rtSetup.ColorFormat = PixelFormat::RGBA8; - rtSetup.DepthFormat = PixelFormat::DEPTH; - rtSetup.Sampler.WrapU = TextureWrapMode::ClampToEdge; - rtSetup.Sampler.WrapV = TextureWrapMode::ClampToEdge; - rtSetup.Sampler.MagFilter = TextureFilterMode::Linear; - rtSetup.Sampler.MinFilter = TextureFilterMode::Linear; - rtSetup.ClearHint = this->clearState; - this->renderTarget = Gfx::CreateResource(rtSetup); - - // associate the offscreen render target with a new Imgui texture id - this->imguiTexId = IMUI::AllocImage(); - IMUI::BindImage(this->imguiTexId, this->renderTarget); - - // shape mesh, shader and pipeline state object - ShapeBuilder shapeBuilder; - shapeBuilder.Layout - .Add(VertexAttr::Position, VertexFormat::Float3) - .Add(VertexAttr::Normal, VertexFormat::Byte4N); - shapeBuilder.Box(1.0f, 1.0f, 1.0f, 4) - .Sphere(0.75f, 36, 20) - .Cylinder(0.5f, 1.5f, 36, 10) - .Torus(0.3f, 0.5f, 20, 36) - .Plane(1.5f, 1.5f, 10); - this->drawState.Mesh[0] = Gfx::CreateResource(shapeBuilder.Build()); - Id shd = Gfx::CreateResource(SceneShader::Setup()); - auto ps = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, shd); - ps.DepthStencilState.DepthWriteEnabled = true; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - ps.RasterizerState.CullFaceEnabled = true; - ps.BlendState.ColorFormat = rtSetup.ColorFormat; - ps.BlendState.DepthFormat = rtSetup.DepthFormat; - this->drawState.Pipeline = Gfx::CreateResource(ps); - - float fbWidth = (const float) rtSetup.Width; - float fbHeight = (const float) rtSetup.Height; - this->proj = glm::perspectiveFov(glm::radians(45.0f), fbWidth, fbHeight, 0.01f, 100.0f); - this->view = glm::mat4(); -} - -//------------------------------------------------------------------------------ -glm::mat4 -ImguiAdvancedApp::scene_t::computeMVP(const glm::vec3& pos) { - glm::mat4 modelTform = glm::translate(glm::mat4(), pos); - modelTform = glm::rotate(modelTform, this->angleX, glm::vec3(1.0f, 0.0f, 0.0f)); - modelTform = glm::rotate(modelTform, this->angleY, glm::vec3(0.0f, 1.0f, 0.0f)); - return this->proj * this->view * modelTform; -} - -//------------------------------------------------------------------------------ -void -ImguiAdvancedApp::scene_t::render() { - this->angleY += 0.01f; - this->angleX += 0.02f; - Gfx::ApplyRenderTarget(this->renderTarget, this->clearState); - Gfx::ApplyDrawState(this->drawState); - static const glm::vec3 positions[] = { - glm::vec3(-1.0, 1.0f, -6.0f), - glm::vec3(1.0f, 1.0f, -6.0f), - glm::vec3(-2.0f, -1.0f, -6.0f), - glm::vec3(+2.0f, -1.0f, -6.0f), - glm::vec3(0.0f, -1.0f, -6.0f) - }; - int primGroupIndex = 0; - for (const auto& pos : positions) { - this->params.ModelViewProjection = this->computeMVP(pos); - Gfx::ApplyUniformBlock(this->params); - Gfx::Draw(primGroupIndex++); - } -} - -//------------------------------------------------------------------------------ -void -ImguiAdvancedApp::emu_t::setup(const GfxSetup& gfxSetup) { - for (int i = 0; i < NumEmus; i++) { - auto& kc = this->kc[i]; - YAKC::system sys; - YAKC::os_rom os; - Id* texId; - switch (i) { - case KC85_3: - sys=YAKC::system::kc85_3; os=YAKC::os_rom::caos_3_1; - texId = &kc.draw.texture; - break; - case KC85_4: - sys=YAKC::system::kc85_4; os=YAKC::os_rom::caos_4_2; - texId = &kc.draw.texture; - break; - default: - sys=YAKC::system::kc87; os=YAKC::os_rom::kc87_os_2; - texId = &kc.draw.texture; - break; - } - kc.Setup(gfxSetup, sys, os); - kc.switchOnDelayFrames = 1; - this->imgId[i] = IMUI::AllocImage(); - IMUI::BindImage(this->imgId[i], *texId); - } -} - -//------------------------------------------------------------------------------ -void -ImguiAdvancedApp::emu_t::render(Duration frameTime) { - for (int i = 0; i < NumEmus; i++) { - this->kc[i].Update(frameTime); - this->kc[i].Render(glm::mat4(), true); - } -} - -//------------------------------------------------------------------------------ -void -ImguiAdvancedApp::setupImguiStyle() { - ImGuiStyle& style = ImGui::GetStyle(); - style.WindowRounding = 0.0f; - style.Alpha = 1.0f; - style.WindowFillAlphaDefault = 0.5f; - style.WindowTitleAlign = ImGuiAlign_Center; - style.TouchExtraPadding = ImVec2(5.0f, 5.0f); - style.AntiAliasedLines = true; - style.AntiAliasedShapes = true; - style.Colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.00f); -} - diff --git a/src/ImGuiAdvanced/ImGuiAdvanced.jpg b/src/ImGuiAdvanced/ImGuiAdvanced.jpg deleted file mode 100644 index 1db17f015db7db22cc63dbfee23531630ad8a291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51839 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 z 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
mu2rPCfyzpnd_56mlTM8BofRO=&{OOj)sMp!DFP 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

tn_OM$3a5p9KO z+qT)!Gg+ttByp5YUBqR_V&MDQX68B`)xw)&!@a-C7F`gim1(WZOSHcw&g zPwS);ix+ij8@V#FM!mEIJhd&ERc-jHRdiO81!Kh&#H9UDk2*{aQ|nRDc}e~tDsbs= z{1UZ*m*!W=l`HV{U*$xDfoF-TOws_BzRnvV2T^Au5rM0=pKAQYLo31NAPE^jcgq8* zDM@wMvE|1*zTSJ-ha1Ot%e%t;Iy#vzsYFcIDlOCK|8w61i$Vi|oqhbmDACDIk2Jzj)=mtzeG(t9;*R1o6|LSp7S}}<)tD4$B@(!^f0w3=NM^h0 z?$%SJ@Pi!ZPxK{+#PJdwgcu^7pV4ebYdlvS{t{PGk-TgXE&*!QRTUO*$z3;f{?ho$ zlRDRIz>>E~pDG_*UNKy3)3ejie!Yhd@A0vvN$>G(W_nbwQl&%sg%y?defQ0&DW^kS z!bT__6KB1*a9FmtJEw(4thx9cyX}J!`|l$Ms!09e*qPT}hW@vs1=2%i`~wcb8DfR)G>hxO@}+TgnQS^s?lzdN3vKOu8a zhx)?up#L16_EF;zbyu`gs<4m0AAW4)p$C4-QTCnB(y60YwV}I#OvL@S1rJt)$E|K& zH(~u1zkh=|bKJjVrZLv2Tp^~DtrCUDs6m;FCVi+-4)EmxM9{cV#nq`Kz;uOWk!B^^ zCO#e!UNJ5P2F9vs&4YRutx?Ky>!iKr8yNRSdd(rHHZtFBk&S8#N#>GiHLqii?XSwd zv6d{)&i(HznL-UV;&o}ZdM}w}^;ko38EkwnQ=E)>ZFDq_Se^E~8HOpU zwP4w(h89`$M{3trZTbsh`(yCTTOXKxKL(1w2Oc*9u84{IK& z$JsaW_uAQh6MG4R@ZJiOZz&!FcS9OepyhfTv1O#bCF1(a3q(t3nrF6 zxi8GHWhv*s6>b502 z4~k|6p*}0IkkTUdH)R($YN3H4B>VZOMXEuZjqu^nt8!!nSpsqtxL-YGr3&mTo#0yKH7OkEzL3U0jZI`KD@ESKEwFH{nMX~b#FQ zuN0g4#N~XYM!tQ9bzk84F>oA@NiJW?VM)n!aOiF7y@^tBY$#OZHkyWGPNPJ8W1?8^ zBZ*OsqdGsgq+u13AJ&B8x5l)$5h!ubp4;W|w_gYt5O!>Wj2PyOzAP;#~;IMfJpoK__9AN zAjlC*Tv)Z`V-B43$#G2|Fm5?Ss!E;80A5>&Iok^$BjdpH^-MSAu==mju|Sate3D0! zT~_kIi^lko6mZpE@cg9qf}0lQ$(2hE?q3k?)~?7iJhc;vmg3P(pu?ANwV*bVn$CA* z7c-eyvb!g@sp0w6rg}#?g#ROQxLYKhHlAcU&9~LjrJNXFoBlGXc07F~m8@|-Qxc*T zIta!Y9x2-cmqZN(k=6|gNKG^IVMoaGNU?RyJfs<5UC?N5@xq%^i!aYvUXoI6V8eL@ z<_VYXcTU|m>98!;s;&IUhEE%sh4O>a%pI)CPesjzwF{G#Sa!_cTdB-`5Ar|--|yiq zYR#?3KA61tK!<)OPxP(SYH`L>zM)(fyqavhmt{kb_^^wjR zPs2z^!%Tmz^VX=QD!cN!)yj!9pCAmqBTn2Fz7ZAz%HTPrlQqg!3JgSCjagOmrWeoul-C{;H2!i(odQJoRD6+ zC|6eX63(gZU;lTUaOtVd_T-(6M1kJnTvU2vP?EQ|Hv+{fW9tPa_}JBn7YIroM09cG zdIle?a8>s4CXPoqnTOOXg>z9F8BOI}5Ch<9!kb!z_ebKN`fl_Ia7K^h80P@b|zP1)oLGZ8d$xaux!*kK^ee)ci|Gz zjUAu1!gHT>{nxBH%@KpX@C2cKj=l`aK6vQx;Ov3aJZhpKSGD&7W%n>A9nu~Y18%{n zM)0flCaMp)h%#T5-CU_@g)%L==5#qIgh&ffYcQxB9jO*4B1odq1e#HxKnvn4|30AQtuQ+h^tx4BaS$ztuOm8-Ebq}lg((KHf~|lM%dl+045%ej-5}>unIJ%) z2H>@ZSX7$@5<*0;)^FbKAJ?dXb!fZSV}CeM{6opi0fWa6%O29Y&SpTLa{O}^{X~}6h$XJ9`f>()mUsx`K157YMHJ$k?9QVQDqX#D52GAfi3d+Y6XoTh zuwU_zQFJ@>X(&d>b`0%HPgg>3hYA@5Fbc5x*(8J##xQ2ojMos)&WH=%EcA1}M6QQ# zwgRK+2ReCI;Fg4spT=)6Bf>(7-wMiYdW@<>A{|)Nv73lOUi+#}6?J|Hz6J&7(asu2ZZc_P#T(%?RmK%RO@a58xO(?alwG`ebOSM3 z-5d$o)0?ZM;6S@L)pwVZe$wqNMcfMEJhFl8!UjM4`lvpWP6;jk=i0=(_4`f9UywWI z^auZWeCEO!7a?&?*1^u*@)xXC(xu32zYXm+I(zNnUNe;|%3r0*mrF8*Du=IcRs1$w z95RP_uiBorQgW&v(7yVs6C?jlD_LEwrKZ8V$H5Mzn*sT3ESCo>!4`m+MIRkIbTGS z&9V4{M`}UGnz;31DyXIUdWH;$L5%Qdmv;FE+m8E(kj&iBb1X$bB1bnP2@`YmX~cqR z2HUtG<|^KysSkLB$f!a&CR@S&GbFl^Izq?`M^zBf=I48}U!*v;ahPV@%uRaJ7N}9xHqXJZe2s2Ity9TLxRv;jIMtaJC9S z-L6wt$rklp$nF5|0{5#JX0I`yE_Vy6BYOb;v2LUT{Q)1n8e^eo1dz;;N*)N-rm2(D z0{vjqVC04L=W5Hn;~$MHDJjWw%lP=<_d#oI*)!K!ZTGt5?dd86`>$rdJyz~dv;8e* zuVn?9OMbp#`{$#5->(uA)?_b6$0Yd^Wlu4SwLb6?VakwQ)lN7V8yY@%a7!aI19CK) zlLa3xF);v2ze*0NDcC+<{1Jm$kQ>v34pqcAcN4K7k_p9AIUY?lL_SeIfD+Yq&`HvU zty|F_e^>cM*t)e?7_VGdy3e-s0A?q3T04X~1I2UnvJ18KiX58Af+Uy0lr3JN^*h_lTs%_qF-2}67WVNDJcNs zQc1$l6*t0XPO2J`V+pEOIV2&Wc9`w&@We*1 zHw%x6ii)W|tY;&j7&u;n{REMaStOHZ%WmpSc?2se0mlIR5xFV?~3V7o*_?97qCIKf{gk+P*q;1o2N$2fNN}rWmGS?!6zii@;CB z|8egzjU;pmFLV^tq6{^n)|bL)#cOuYO{pb>M&(HJd2Fp%3#18g6g?A?pXVy~7Vacu zWb>e!RSTej2GFanv=c5Oh8B%k?;g5db#CEmF*Jko9R*H{($HcMsE)u;l($}zQi7@c z_6a9ah|eIt!Jx2ybwZRluN($m4weZE9&Bx{Nz}tq*y>0t3g-=FRExS3>?5+DUBoy>ykA@=!eRc zXN^E#Zt}yU(xndMuvk7#DxN=~kh!piP9ni+sO@|S1VPT~DTJ6OPMrvlLhPeOX47$cxoLOLWdlxbAbQwp zZcZx4C@>>8qdRWGYR5&aDRD9>z7XFH*=+RyjaDi$V=kj0J<<=Vz<;o^kxGe_AP2Cau{M9oEJ45@vZY3S~UBQV}jRC5GlgX z)MEntsl$ZqU4hdk;MYxt1>JG@y` zF0ZAatqocVWiREmwH|pnLP|z(#vm!6rC;eqlc=0*;1nykSgVtS zxjMFI6olMrwU0E#ZQ3Qv>LRh{?$j`GwRM9HJZ)D%QvK;G5q$(4&^_XDz)=VK)|F=l z)qCWYxOQ|N#nz4<4_1yRxhTZ*0JVoJB|D1TJt|_MBiZEMIw^^uiQYsB!lK6Bv))+JZ|s|iB)RXr9syTo#q`ox%!RK-CMohywO`z-csIBEt7o- z2*>pv)u{!?kq20JO_#UcB6E?TomxF4h8hzmmPg~K|7VWs0;B4}N#hwhytu7@ZJ2VQs6##2yU-jaMCOuxhL!40(7a*Fm-pF}?sfuNs120?fS8c4j@mNW*D zne&jSlr#i!J^XmdH^irIe4uxV|5g>DpNwCxn8EU*ic zEHPx=oYFgVZoxDPwyYKMq$+IL-LjWz%X)biRJZE~Ue~C}6&?uC&ae6Y217u$hVd)$ z=1-LO2{SD3gK`MN!OIx{6nl%+p#ayWpZy8g4M{QHi5H`_r&dlvdn##8n#4sRk^r9| zwT?8%La~yRm`DmEY@fTkqqp0vLt8&%>`~E#jDhn@#-E#X>I?HwDJLpasAG$Kdt(eH z1Wi!d?OZ%Bvh)1Ii}Q|m>py-_t2cAIf0$?cqp9-sMwc1hLbG>T-@5Sj0J|U1AGoUo zD{HMB&aEu+1FHNh?leRiyunw}wtHK&1m8 zYHXic-eB8%lbdL;?H@%|>8@fUX-?kQ=#f`Gym#;HrF380rR)WJyL8<%A49`SpR{T& zs;JnpWTM}a9W3mbCv#y9w=K1m9Q>%5oj(49iW}*IB?Nw9P58&v6B6mD)v5efl}|h- zsmWr4-ZjW4hlLMeB`>`YZB3wpi*+Ss}H*O`v8lkmkm zy=J;>v{gKMZ3{0r;r!McHs=SRnJ92vmh4ikI^hNB^=La@IP@BsaOTtajWZwV@i?{V zE)KP0aaZC{JEqr4;3S>7QM~3+`eVIQ?u?$A+gTR#aj|Y zM==>Q4FoPeLX57q>4NN8CkdE%g-!ZOa*$1)6f3b0_oImudg6!+;aQ`&M7b;uStGAF zWQ|l*6(zrs-#XI>0n-RI662|`t`L!?%K5`GM7>3b0)$nt9 zqZX7_)A`3xEC!?zwF>|F4|sU7uSrM_5;#8xR4Hd z8#?GV@L3BxgcI#K1hVnDC9BaCPqb+?|KKk03^{uopdNy=AHOO zQf2?juqVN%x|`tkq+P0$Ptk<+!QcxNm5Y80GKQ}>_D}J}hXcBQ_V=aL znNqHub&qWtGkMkHyXT&XzHNIBZn^BxuGMYct=z0+Rbl;ODrvHFoktC5zsIs#)r;^K z%$tEr;?or}Q~4AfB{6nBHN?bUDb8id#N{(O=#284l%H+_C08 zoJvFYVkxGK0pvO}o=cY0e#WEKws4iqghrRkSRi8^HhrAk{qxe)ExDdcH>h}l&n&DmpG8a~ z1l8C6JW_)aHY7My-Zi+(1`|#T92lY;(Dag%AQ0&*2&NrMg?{>xun2uPuN-lLBvIWf z5go_64V7{^`^?)twD@CneO|7rouI{~`m7RG=DpLP0S=G(`{0k8kiGG+(M;SER?lom z1Q^^tP3BTPquF^**~`QWHgIS9i;Of>H^^a;WRF7ML>oz#7bNg)BoL~)dHt+(>3Au} zPO!zVnA`8){!=@xe*22q{d7Of&dmw3~9xP47k7 z;rqR3c6Mh??*IFq=QCk;XLjbyDerlEX_Y%-yi=wbG5*)8Yk?7*V4m0-x6fFDv>VJR5G5N91}Y*QWY%ScuXKQ+jv+;dN$Vv^4E3_4aZa&!udBREoGHBuf+nRhQn z2c-w)2T9zc#vr62)iT{nqcl{rfWLszV1QwT^NhSe8A&|JiN*`LkZB^YDP`yVlc`hx z^_BX|N9UJ6>RiaHM=Q3SIDBdko8#C@iF$kbz4^qgyF;5j3i5P(JDV}@(7q+BRW+8k8b(YBCJCRs91=dNH;<878Z8I z#~S9>#4j+!79N@1CeAx?UcbWfAvW8Pia!13B>L@R6SMoI1qY`UX7?K2y!iVpTuss5lB@1VFgZ#NuBDfAi96pf)BoyGvd*b5ANF2viiIgjhohvBy z+h)FAdFsU%Pi?9-Z}S^Cuyk^n)Fiw6%p)IO3s*iovAnS7+U3nE;ckNU>MW*8tx$4*)$E4_6WDeRai)ntZv735s8e#>i2m8{!c+%}n(3g;vdS;j%+6C58+% zw7iBi0=3Y4CmH;7QesG3g)xS>)2+a+mxS;*&#?wmY#GErOBjpyE85s+;^M38%7@OH zRneKLwl5zrb>#5ofg4)pPaf%bE~VSD858FtuN}po>iH%1D}ur2kt@k`IN)fD zWZw457^$X9;w=~vWDPbkli@3L!S*iA{ep2HR8{Uoq@mz0lvQ+ zuLu505I2h*&7TNV$9J?6fPF{cX02sTdc#>#ebHQ<@DaKD3c@*zYbV!(@1y8o_>J(e z<+=cOx_@+zq60L4l}xVfb;jd~9WT{fyjXKd-JPKY1#UfGQ<3~L@kMdWp zVozfo{U~Rsp{5q!PI@0XH$(KmGpnnCBMxK%Qb9~yRCe*CnaIcW^w8jCNsG(GzI;8p zVLn=#{)_qO?8?#U^iR-tt%rXy&<$Wz_e`$!;=VgR1R^o;%t6XqICf=KkAe&)FxczuD`F7m%HTKT@m8xx3<8R~ z;8%bIoQV*!iRY~xW@*3R4;>@7A^gRNEvqkHtVZW9T|)OvL+f_`xog*-yX%mS5dL2x za&U|@f6C(&B4?BvstjO69?8@6h z`D3TclnZ2x$rnh;?jA7E8u?vhYDNw_32wiwt65jrw@XPzc&3Pi!K)hrzN?&!yd#~c z??7<-u?PM(Z?3)v^nGgNi3lQj-dro&gV7aFaDGFAyPS9$-XexBf11gB(<}{)#khx)|m~sCo)+`yJ_le*+n+n6-wjpgC9_X6O ze|p#XYVu`*c;KFSMCS3FY2cy^+yj8pnGr{`t?T)GV3@o@aA`-1oGnZ~CvBVEx{&pu zoH){aWXO3QQAhu|GRrZ0>0}MIq>0XchB$3lz!x-k9#hQYV)TA;=AQZqykN*V1f7X7 zQ3eb;lr+G&Nr{)$eF2cuM`{+5H6Xulp+vy4-?s?eWxrzUPFW)Myuu-5&I)AoxeScJ zVFUitvj7|3LXpCJNMh1t4UUNQzIjk&Zk*ELUf<~8=P8^CzSKme(LK~F05Fql@2ncN zsHTQpsKE{ncl=k1c6=j-a6C)76SQ1H!O#*dReUrp5ojrx4jlE|c>IleUpQRi^-72j z51KYG*DU?GERxj!5jN&h?#CJ5gQEw)#)38E?o+ls9_j%E?wrl1Mii48av<_`*+H~1+?D)p+X*Fq`Hyl4I?ixHKrDe-j zHIAkI`=>-lCm%MMu7Q2fSbd3Q2iLQ;U#kN*?hRC>fM2BL^8?xaK=pSH zR~nBHAJ~>YLHw0=@=S*=uhm-vMJLF8q zUV~m()c(Y(ofl7v#ofDgZ~txH#3OsB73BtJm2@pClvXcno!C0t*0r?TfR=hm|E-)!`LWA9`C^2$M%~5b(oEB%$R5>M5eob8z2eMM!d*l$A|o?Q+AC<%b>0}^ z$hd+exwP$}rfNt2<8C)`?mG^ra{NHf;%{LoTl?-mTt2n=Z%-!jA$lGt^8&%jm* z5&SfM ziA!vi(K#_^*6{4?;j?lQJ7=^?j1O+s(rVfs8k^cW*+0sjo(50xrk(8Z8vR)&^}_lF zqJp#>L~a+_x_V$nE(=>m&x$qUCQTk| zI;Tb)c=Sv)`%Y~-dg##6>`OlHWzbnP0!M{|_6b}9)ZXnOuzOH!o!l9973AP!&_|#z zoZUhCPH5Rco9!IapnnKlxlnWLxIH$xsAo~1vtlLEHomX6x%28T-F=RROj)A-T60#z z6`+(_eySYg1EbJ>tzVq+(qY{_CpsO$1cCl)L7&0AWD_!szgNd%wzHOX=e)dl7ROIS zTXHht1-#=Jr~7>s)BmFTI;Ur3NT9pnac@o zv0%EFh~c{yX!uBq;rn@vVs+{yoI-;KtF4nfOT(MDwaAVpeXn-PV zW3$Z8qLZ2vSFjgjPE#VR&CX;Da$gS)&`c-A-a27`#q*? z#}}K%rI+=evGKs5UNlC>^Y&g{p|<1eQ6PC?oRkUL*WhoZ^IXRH$I^2q&o_c|UcNS^ zsW1Q56p}Ckm$VZQus}BfBS*+E_bG;gj%#KG;z*#6;}jX{I4BD;#C=Tt=*Y?XgU8=E z+2q#P@%ILpn(dmZRs}w~ZO5gvyUvXr`t&|@8!|fOg71l(WleaL)=b6Hg1fmRBN8Nk z9Gf}Ui8EDt;xgCvH3%w7xWJX=;kFC5@Vs!?uLHtilr|2*lj*<^Vnto4jOco*TTKB- z5+zlRHM6(R-DWR5cJ6ucxyL4tRcB9{#CA=1d7@as*ymgBHvInC&i|;6od+%loH@uo z4?ew*+mWS)X!%%Ugh|E7ngAd57N`Ot^l=RQL45=`g{Gto6hUG^#l$EPR1A`f*=_x# zpTm$Qz*c8WzeI2+(vm zd#T1~y(#}#{bk=L+IN$WvpXzWeSe?cHGw(&9B->b8&AUu0VD|pM0`E+)DV$~cV;{U zM^X!67ZOEtXD=XEfOCenh4__Z>@E|>&@fe!w*@hR7WxLZD-n)jRCA5AF`Ba2;WuJR zZnyUNq3IF*3%Xc02F+Z!-M48*$u6(tF1>eTWv0d?1(|)kz0JW%sn#a4CD^ObJF}#P z#pGr34UUVod&yymwC@`JDPL}!YHkXBMsv#7=;XN|AaEtDw$fO>@Pu$vlB2~{R@76S z*=TxU`t^!0khPCBd?UZxxE*U^Le&b&_h`T=w8yeDrI?0q*ycWW-cj3`CReHN%-TEUYb$c~`Pj@`C1kZTGD}@51WJpT@bva4~ zC}|tP>?Hn*=tT^jVlh*oB=31Pb;J_a(EZND8BE%{Z{4<=CiTo2_5CNGM1S_6?dN&h zX+5)5UC_7@J0q2nOV^2JH)96VqsCt13ujx9g-{cZO~lcYhLmD8!_@^5(ZidUkFutZ zjSTqSzvxePx@&=!Z}a{f`4u6`^iSv_k=GOOttl4`{05N^3Sl>zGfD3P)T(hpF`rBX zR7L`^1?U>o&jRWv@j7K_JJgb3O0p+pN{e1|408;0KsfEN1M~l`Q{SyShJ;+1RN|OwBCLO6C4x?1~+~} zb7ZbDSqPtS*FjnbqR~mgj&COxw@+LdTNpmoYjmGZk0rM*whh_Z)sdb*ENPy>NIOai2EWYm#RqG zor-}(vIGLvg=z}tjPS59)!t=D;fxV|y7r5T%*^lGd(wzr<>?`b@;ki-TLz9RDj1eG ztR%me&%n}NJqK>eK^9EbZ~}dP!%~jek#>CVBJ&S;1HqRkk^oF$)`ET9!+^ls)P2f9 z$tjLoO-Urc(3Cm-4IEW-)*P6>>ae;acIM2y5xsj1*pkyKBGy9$%U_Wpam%8RM7C&#{e}mv0+mnm%eu zhYr(+r?nl8|G}>`gviGmhnPQxg}5zprMzqqa$tqyk}OxU=_j1MOmzOjeR6Q3_;LF< zQCjep0q(vjLEM&H2@jE`ie2EoI(A#Wug#ukFSd`d&$gRN>ss>EkXm{?EJ3W{@pyrl zrwj4%?a055EbHzciO*S#~1aOof2pFG358 zoaveNM0L@zZp|lm8!~?R;X37vRTX3y;7fUr5X8!j=O0CLcGMXj`{3^ znbzOE<>Sk8x(x4AGBkNia-4VJ=x*J1tx7E{?%H|UDq`I)*!sv);#z|b5-D~E; zoxA35+Pq0^XgxH@XG+I>`FQuv9lIK)u1AmkTUS<{R7=2RzjN4@0CdZ*i?zs z3WtKTZt1>*^qFxUa{}tCyYFX_`#!;s(&jp z3zm(WFh5xRI;A*ZV#j>*`;K=LTNb+}pkU0DF`wp^rAC&}z*)l^(wpjKj5|q~t&N(? z*7~Tq!kGpNVwG553vXd5kr)rf--jn^fO6R|O59Z!?jDlTOy;Ti@N7$DK$N+-lxU@l zUI}EkMurfVLA}U*GeX3INnQ+w~n2$aq+~J@I+WJB9n1x&-W5Q&~NCXiEFhllqsY$Mu}%72uVSnx5MQcu{P)AfHj6vAhHd z*+MA9NWo1&Ue%XaX=33}tQBbqa${&(mQeSQu;6vg-KQ7?w5MFpr=?j6N0D%*p>XKY z?T%Sno|mfU%&gusyKDRA6+;+HncSsk!RjK*ONosqI#wRtIc@%~_yLPssAtj#6m{=E zdbmelo52GPeKoq#U}4;DG=vF54SmJ7YT@o2k)AmBDfQK}t46OFcc0ZBOWj>=wIB#shjb((1+HPSKpHsiuIK*lf(jLid} zKvE(e=(sLlLk6QAuKAFX^*+>Wc09FcpH#JQ#!Bxw-nm^1d-doyI(6l}rd9Ikb(7aj z+caSaYn@y)a^S$i_+e$=#bs$c!CP{j`l{s)d?=8k-)W5Fni_rnxvon;;npuKlOp($ zS__HS_=l@l37HNt!JLH;%+AiV1jjjcb*-pqeQd++AGVs#_IN^yRHL&lexzQ6j8HDu zIexX=hHM|~+I3uSjn|rYWJAoY-n}~JF;m>M z?O4YG)I}Ahuu0-TTAMPtuF;I={fHkU4FaC$`W#vtLE^%bNvm#&^kH87LM`&oK!xB- ztUYR(#sx~qg9`!0arxSwildW{S5%pD*sG4m*cx>i*zN`NCiwL1}CD4ZAU>o9L4_$uZ9PcfpIu%ltz2aM};Sf`HpbPh3_+^=5_o zVtF}hUm@4=fVzR|H1-ho*mbm9hjvL%*TXei`s^yQPhelD142Q8h$YpldpfeqnQ7|WLFw^cO_m3;>~<@*w9XvA(X`_uap0%{ zBiaP_Tx|FE2`5Jc1i zeR8TFc%2gHC(tX$+|e0DS>1E`Pa8O6e&t%zj&_|}l_VB)AJcEbpqFGm=g$G(KV<#_ z5?7h_Uha&izt;uhQUnKXUoY~3x>(`6#rJ?O-0=(>RteH>X~91(E@-i~#a`5e;!!T{ z-lCfzXBrU*!?Y2CX(>4=1NXaAo9Fa;e*XAzYvwhXG_uvH;=~mbCU2T2b?rFO)GI1J z&{olN#Khi3dCj6*r*%v%8aA~ksSVBFe9Yf+%e#=VV_hq(!wxN=BJb2%V^~VSFRx|qF8Fc3)AIDSjarFuC z6I4fVuq&O7Yh?)SaK8*fq@tGD9aN2L7+}}XS!RPALkfO_$OV9c3onomFAe}e0t-yS zA^a;HZ%oVanqHALVM@ia%H{ca!&6e_<6SbPrs{|74{Ta?VA9hA#`V8LI12N9Uit>O z=NR^1yf8*9Z=)eaeb$v&U)~#JWHvDHiiy{eM|B&$t6_$jZzkwd9_hY{9+PD4-R)Zan3FmebnsAfAlR5&`QdE(< zi;9nleyBvWS5qRyhWQ5Ctqb$uzaiGSLWQ_EM{AHBhxxCYxq?mCB(X4dZ0NK{XQ1?hC=NX!xyHKt zk16J6WWz4!=4QwIi4)y>ebOY*iQ8p%=YG#DQ*#IwP%;R8DFZD|#tiBlu#S$YX|hI8 zQq)lACupE6rLG~luH#p)&?tL{tQJxBj`j-Qu$K0YX}-=6%Wd_Q*a&Nz9)+olK^V9{ohfhmp07GqyK!yOP z$8|cvBqW7~L_4nJrj?If(RKS*J9mX`-pGRFtQpCEpx;kPPpeOG z`rYjQ65sWp-!v~eGe>wQ0EC#&UBl<2_&y{Qc`XsChZ*13Xj-<2+;6L94nW{4r@_S8jw9Rw&kL+@=v+r zSdn^eNq2Y+zT36P>nRO>8ajiw%0Qp21j{bQ%A*_TAY7@qCfTg{C~@VX;wN!Y5ROev zpn4|W0}~XET0*=YH25w2pXu;3Tgv8@d3%+V9~iT0#h3%-rlqN=Y^-|JZf9eW)bJs7 znux0QNbTM59_YxkmQ%1GB*51wTY#n`O+#!R0xaKZ=%L~x^FTu%t=hADmXtsqu~`Z4 zG^+OOw3vXf8ZaCAP{p`$L%#QzwApDZ(srcDrEq>ti%PSl<>C8<@6#I7phHTt)+M{G zezk4uafKWevPkItpCWxoxK=Nkv_!7hy=;PPvRb@j&ussJit z*kdfSEh{WLEPM(qQ5Kse58p{XHdt1`Qj>}V-u&?Sf<`3TJ@4e?9Pd8m+eI6yYs?Z? ztaoGRR*oQY6w>#+}>j5)|G1dUk>=4=VswngXR`-ShL8>0ac(H@># zP?X~eS>nPq_kEc<5pE#r{=eSjE3TVHIQ4*}Z2>DOz{x)H<{;HcVDS8(TF#0qb@7tqIWy=?VD>B?;zIE#E5I zOtvORC#NUpC!11$hxDHkknYnq!8~AEVcW!a`%kgjd^6~*plt%l ziAC~(#yHCotik+-aIqK7(S4iaL*Z=W6~6CaJ%be#TLkz=)58OGLplqvDLw%_{0Zm4 zo4mwfc2a`f6l$_35cVV!cSB>dW@@_lPe+RMUCWl2_N)I`slIVQeNmPcEqrd^^NZSd z>B3s0Qq;RVAM8oBFYK|kVj^r_f?yWPiM}Bp>}s{I^s!mMb&83=bxNg#>%Qtv@ikK| zboXsW3(Uf{HSYZL67~<4BiI@o9h@GVA6yb_E>-G-St$`qJY!aOi7z4kIZ^1hSbJv6 zpO-;f@l2#OGCDFnGC#5;(#&tC`zc554a-@2#{k@KxgsfSFtCw(bCTna^#cM_%mgJw zZU<+bVZHYUnaTY?kHbdRbe=OZROo_&yCkw})4?UP2Ro)PS4gWNcd-)4uTozu z_H2*-WQSS;@9y61>dc`-;)^WBLt1Ie;4qh(IhP#mi*6`B@7>KmzZcdpzLEeqM*AXmpcL@5)2A z?>mSDPer}9->*TRb|CNm>wvFVWVvRB_-zlrq-cc3M(YvIoXMsWU}8g>Or=>^G_8Fz zn@18Ws8tQqh)8a*OmKmqxH(O^3&uDLiDAOrA;O|CeaYrCr;qPp?Uok*fFZda|-DTX+2EN^?*;SGlYnPtv+ZDDmYP?KUV}XSm+I_ zg3Sc_1-BKf1o%W8dBhMcfb%~%tY(JdPyFoJXRqwPa_bfjrp)U5ljH;RSAFNs9rO)3 z9MN}wQyq5RNF|c{B55$<;q1)mD)mP2*KMQlqYW^22;9Bl6wJP%!WS5Xupq8aK^hio zP&{OL5%oQsE0ZKHz4F2LZ@r^>UV3EkB)5L^-2=@UfTGL^fPksG=m>xGegchE=%h0?e2RMz3)&shj@0@5KM09 zY@ppLB!tUQ1-ZIfdgz3x)`GR}s^)m>eQl$Db_;#YV?rA1$v!!-`Af%ZWA&aA z-fG_XjR|f~+=fx6NZg~DnCW2PEn>$x$EN#8dN>EW2N1*uz_}L1Y9PO z{T36K4L>|`#Nkm{(xCf0ipGrY+iz4UjU^0uZN?(TpX@PHl^|^_NZq05KH{90p2xr= zVFt&>l*d4GEAbJy2G3vM3>tvOn3DnGvmx^Y!mi6^t5Hfbpn(h952+et1-ZG}F@M2G21_}}$XOiq7bh`D@@b>DG~ErZ)Wrqvi?Le2sPfd?F0 zIEi-;@K`P3#F=Fm9TlTeI*viyxrM5SHFk^j4=O(-mMo4auR!c?_X3FnK z;pRudBL#uRuOZ3A!}m^;F1RNHi5X$!0(epLbdXB(eP@TQ2-^{MBVAEzizfHUObqQa9Y^d9z>;_iumm+0 zB5BAY4Ei90HzeGUxVNDWUkoKEGlNY|C=+iD|M_wII|i~n>gdL|7HQCB!r7%$B7S(?P-|$c-!X#^0t{*6;5?dcUG+9-L}Q! z`(&LUoHQH#uXfK30Nr!m!6ItxxpQA@^Ug96(_%@qi`9JI|9M6#DNtl>;#t>`6@xpB zxdt-nZ2u*X_O<4;x1jaEoqN4~wu|Oo{YYzHn|(IG*uFmh7H$5a{&cns_Sc5__bv7v z<2&1Th3^jEBfjT-Z}?*VHTl&yz(300=AY+Z?2q|JPqa-%5k-axhj(*R!zm(Bc*Kiy z{95sK&yB#kZ)JG{m$Cs5EQ9G#$*7XHgO9RE!%|?5XwScgJzoO5L@?nZ(wTbfd2lLl zx#jYt66(dh@sUP91mFtS3UJ{X763rG9G*;&Gx)v*_h57bPJ&tMfsNXF$;ES~ZhTjE z>eR})JBNSz*M8;ypZyBc`USf^1dkB-S%yR*Dv$6?IQkh*+v@K+BxPFS9_Uc-a~GHV zr9-R(dPFp5B52M*)3d-6B=b1^7nJ}Blt&=3bs1j?aB z31CFI49^F16flvXPhQEog{rq6q%S(8VO&mNDCJOUddCT#%(1*N$MKVVA1mz5`zn&^ z1I)i;`GN)V{d=7-o`%O7bJXXcs{k$MI#yr+Zj+_z9&r3m%0~VUOSn2~#e&5{FJ2sS z@#5eopOmhyzSkh%Upnl{743ht^JZgCV+QynANWA&_Ia)(1#hHyS-2(=U}bW{GWrs3 zfs-U&6qBTO`~Hs;*VSJZvaL5vwLgAz;@%UcXUUg#FZ%bh-Y)qq>#AaESCqM>1n!rf z?OJ%F;c-dXYU0yu%L4W1>nDEy&Q$y4y-udSCqDWSynX_l+M9?MA$13Fx%R>HGl*XK zT8b6SCQK9VKaK$LZ8+~~>hzvabSIy#?Gm?`Ued0u70Sx^wMW&T#8UJ(Q5feS8DboZ zz`~0{6Lq@u2);?U<|Qa5QA))Gz@wG^lOAc9A?>9j^@8m3U^}|7tq9&+ zP%$tnX7m23rP3ufP7dq6dgsp76JJC-@#+_>gYYEUiE{M^CFEqc{7qUcLn|TXZBs`| zS0<=m6s*|2XyT-oHTW+^e|D`1|JJw- zcn)(tMQ$rz!+a#lDX-OE`|YHD*n>@o=Wx2F|t zOQg@mN8w*j?@QJ=OMR*EPVRxAQ&>0~a0=ksxruN+*2Zryxg?cNEgH{yXrJb$x2v`m zba`v~1?MNm#)O_wBF6*9e1#(IOA z>=bAiBgd;VuBvm`&Z}%MpmU7$$bPm+MG0zsD=NIO_3! zJsTRI9bIhJW#~GyLB0beG^V)*djh34h$I*$(4t`UI7aU=_7L?Nc^6{jcIvdN>U_41 z{;rbw0)J!K(JIM@4`F}9Z#0I@Vz?M9y#j78T=DUzd_5ffanCM|-3PgFnjpz|y?OSi zk@IGaE}bpOL+8vaO&B_B_AqMal(1WJ$g2SXR)tBlmADHGN3|?aax|P3H>+OK4+O*8 z8h>T;g*Sk6f*o|exA9lWhVw)r7zR3v5X`P{n8tPaHP`hd?K=G~;gxvj08wPE#kaBk z5w6@R2z&5$??q1RsP~*t8<3Tim6L;mI6bXXr?fPlb`ZVj-uSg;sOfp=0^?v|vkTqe zTlJJ84j4%K8Ijv%a7^Sni)4Px;>QB)A;QBRxt6#fOzX)xPbbp`;gW+oIQ`maXy9$A z!N@b;#M_j_2wrj^5sDORU8{3VRP@lh&MF zy7bJJUTe-SS#o-dRI#R}W@GPFHK(^UM0S3cdq!UBfx zo%wOJbG>3IbDh3TUB%bdG5fS$a$2??T}7Qz%nHH*0?DV7oJRjd_h1!_}l zN?P++dMM4N*kbwPHXC^%8`h+@OMPuSvOd-gb}v+I?|Q0Bm13MaI?4|!>;hoEkg$D@qA3t%R z_U%Cskc1NXn)E#MWyCx9qEaQ_d|cN=$}$mq5`3gC$zaDi1tusjz_{CLE!?u>OPUDy zH#6toKhHn2kez<~<|1|m2XlmajE&a*IF9KnUt??dJHxd1apJ+1a~he4AePD2EPUp1 z+=z$+;&ISV@uah#@SGwP!HJQfmt3ZnoiraUkO^8mx$v3u)r)TOmZ%HFC3%jyjn*3X zpP|;EM}>s$9J#wqZNLB>XUo*O^gLSM|G*oxw-7Fkb9^KTjgNqCN4VpiG>ZM#;N};O zGusMgJAOGd)bSB}R_(;1GcsuGOqe0;7o(*ofmN;KZ>WeCioC+gpf|7>*`d>G$q+dE z9!uILCW1Dt4QA``+;E{<^w*z*4olLs`4X)b3&oS{E=yA1+s;H)m7Y{9g4GJPolz{6 z36k1Ad6xVvV1g>-C8PF6j3V>e8zf6`S3^?1;5%XuaZDr5hOumhJex2p!Iw}EfrOz# zvy}i>a;jkz+77cq^~z$_n-wfpudu?!>IL=5cQq}GQ|EF@`)s(7H6tfyMiwh&C9Gei zTE~hjRYk3>Wc}6iEu12rv;i~-78iAcQ`T$k{G@r5gm$2bW8jSug!PCO7AY;bt)Uj# z>!CBjQP0t$%N88UVu09UKzr&U-6T+BM~T%jD!5s_BKdHk0lc849x6kUOc0aHKbrEN zuwoLD_GcmLA(MMnQFtcR)|9f5&qSZ7BJUwr#4RhuTjH6^C#M!19x~80XoPyyIU^5C z6S8JhKAE6A;(z-@-J?_bSBqy#=QVNMA2Oj~3r#?W4j3+YfFN@^Yzr@9XLpB^{zY75 zLZBLN`l)d%WT^y1HIY`*txl{n8&Y~fWuBf0Ph+HgvvP zsm8B=sIcbIqOCirUHK8yPiAl4uKYl|v~^%=^KrKhSV_{X&zAV;C6l+Z8GqbkYv&JD zRT%Y;7e2Ip=hmV}d4H#ua0?vY?3Sbi?Rxfu*QNh)ok?|%FU_kMQQo<{?up9I4Bz`lJ zRdk_iT`ESb$Y1u@W6Scf4kco^6eeB6Xu}mjCOpAW4`+Qf-V>~Nj1=a`6<-j;8T4dK z=pf9JrXe4`QI^lfY#t{bWESxfSPI79vFr9KRy@k^&z- zRUYLWpklVT`ENp_yk06Y*#*Xk2{-Uh-N=@hzI6CiJLGE1WqRL8^)`EpzpuMua=wqq z5wJ5HR^6>B-i#}bATt_yeAJmXl>7zA;Z;1JAJh~h*-~}GP5d*j{G)d@+*rk5v@s^D zW5thP$1n+*2%93%(#QiBDgG*KSdD|^uYkrOS-f~vmF3)fi6#WAFrfy>=QLy*Zy{9? z4f!cNOgg&EqIe19lS`J=m<-t}$HfKKu)t55kNU@#gG{xJ>X1gqAJkV7@O(#JBV7l5 z@k8c1FP;UDv}xYNli3uec}>Dh=FpbDv@%0%N#ePNoS`j=aWEcJbezTxa8# zNY@?K*J{qxFLK<6OZ#8mXLn|Aghq$I3~8ch)uGY%aku{0mvI6B6$+JV6u-Ij$@_JV z5m%N<*Xz%mz9Wl2I9~?bRiX})HnG##_W?q?`;>=C6t=6cuxoO6%wrHB&>BqH!^nX^ zL>HVnW;iE-WvYWuge$2Gl4|%EPPr!r*2+bWoJy`l`}W*b7)RuI$BR!Pr#8I*q<%7ML1ktvp1bQHDICxPY;~dTtLbgS!Fjo< zhihE_JR*)g>G#;t2E&=%hNXSx$-bGBPhwR z^+=QhcK0K(8L$L48m>i%5zdC7B*S!)Z89G@IA7f}s^`MI9yyzqFJhC%^_ZV4KC2ir|Ab=r)Mhhth0Rn{KO1HC%_?E1hzs zBCRIChjc+e^Q0FFcWpL~PRJtRW^-Mfueh0XMOR5(boG{VJ8B;dKWc2Pb`(p_t9JIv zd3JW0b7wX*Y7Ct;;(-f)nRCn^)=4r;$QwYPnAiV#k33MjSA5Om-V$-Ac*t~3vRL5L zCLVwej^iX3J52s0gol@iHkM~z2Yl84GWz~WQD7^eB^Q|_H0&%ankKcdV_->a*HG>vR2Jlg+2~~w0YEA1UhL|%+9>oFvCz1Y}9kkhD#861i=<7CJoxW zuvzB0zN0f|9QBocy~H{U3S4khz3g}J+tIT-vE({!%xLc*+Ve+y7Vc=tWgF5?z?ccD zgvc{1q?w>_cCcu5QO4+^nvB`UyreI-e)mMH*`vRzW8ID{=%l`S8GS29PO(3bPc1+g zg!HPERY6;97vPWvLQgEkw~3zRi=S}a1SK(JO}KIkN-7_>O9jRU#S>Di#Zk&i%6NLO zW#Mjyv?AM(=+tzsVzc^!>WeI_JjW^D6D8_;@er%i_NKbaV{gU+j``jMyqBxH+4t-; z?&~QC>TVA>#(f-)yQ;gza}4SLOAq5cT%WGrgFqeeVSW!ROYU|&?#V(s*Z8}zPjQbE zU+{fOeRAznv~`-_hkfd9i|(Y2f zJT3IYHT2tctv{~az%}%dt`V#|zGO$mGQcM6r2ujQ%ItR8s5xe)Vs#wGXBUm;Fh2K) zSDSx7z9@6SUiHSFe+>hG$DHGP+VNj@P;Ud?3}oC&2(h>T8z~SEuI|-8V`OnnM&X*i zDSup}f1=R?wZC|e?UXFiJVChsj=pBxNJ8e57EXNFSuK*h*=A;u zmf*g6{XV`PbRT!x#hi3T?VV({3HPls-p6SM-A6v5gsVxeYGf-V3)_qP-qzugyPe`b z4ww0Or!U?aAT5!4%ch&I_#M6y)EfCAVLH)XnL1AVLi`NvjpyTV;%ja#(%Zv5QUcv0 zflJ3&|L&e8>Nuo8`;1xGZXw8hk3LS`FSH{+#pi5=u^k>m!QX}TEyMV}fbJ|n*q{hb zd_g!|#}d?gI?+3*)OsUJ&`xhQSFw7tdCCepjiS>$e7o?m_xIjN-X?MKM}`c$X}%#m2juUn@8##^<(n@8OBt~Ks2ldxMiO|<$SJ@8aZZ}zuJjsFsH!( zWsdKp_G}YiG(uR(V+)~d+-btw^G#?y&qN(FeQ!d?@O_>VML(^etNEr9x@x7XKj4B= zONV@a9DbmKuRqsVB9o3*D}}Vm2+#|1qeM8VJdns(ODLt8nUX>gj!T#lUUK%bDxV=$ zdzAB4y9TnAV@p?e>9Xo+^nB~6>91XW{FTx_#e|uQrmH`U{hHte@F~7ZaLo2#?do+H z;1&uUPLkCk<`6prhSwYK;Rsz{--(Tl^0#INz2Qp5>hw`Ys0A%4hZSfDm1dgu52*rL zXnAW|*e<@_;^P+IBfi+9Sfg04G->7xpsEWrBw>OQ609b22sAfbgy<9FK85HL6UfWd zlb5w#_J&uc(u|bcQ2DJR>DsSzUR?Ur`+leV$`{RlNUWYOzUO$A{YPykwqxuaCf9FX z`}V>cPnOTWxVd`UHTKwg^zeQ6nbx+dCv7Xta=r!yj(-q0_5^YE9(keQv6O@`D`Iz0 z%AH#DvI}79>E*ez~j-nCJO)$TSsn`!H$hQ_kABekXrO(OPwzx=)K z_J(%izQ^z07pHFwje3fuUS#prw^`;HHu~OeTbNuB)5I}v!whLdsQS}q*!PR!EB!8f z*He)5TjCY-w7KEt1l=CS`2>Oxe^**bV+}Ph2gcf+5%o$-i3jAigvkqrG8>hAG89@? zB3s6RAyHEJU6>zO;+^od1$F z4Sy!$^h1~5*tp`H&-i0mEm)%cVwcLz5$v_Q_t`v_we=O&?xgDY;_-v(5BIm-RDVqo zUt7AZ$zxsz)iM5ik6`>GA>dBo<9}F*F^u2Ce(Q2qPKn^|$|)X|YltIKvi--4x{JFvK?jBKcj2CB_2nALhVL zbrboYW`uW^sHBX6;W1LES|@cDKValF&vP&<1_g3BX%7>R-TDB2$vZZm2d5H=3A7Q@|W2hhGQCFDP zr1VfI>L+~a04*H3a93&l#5IqCNL~e`1~q6n6>C5gfkiO?s72jLgLOh_5k6VVVZGxiesN6$n&3=%cEJ!f(R^jvvL!t_UEOz_<=nm4?aF!6;+J0< zw&Iwa5vgu)q>3*um|wErk@LH{Rr1OG>OjL+a_*9?n^;GpDU|g?Fq7`9Iljd~GnOJe zp=}V4`V%}Wn7&&$iPVS8nMv9@R-U7ZqN*UIyPfc`$nl6ptVaPwLOW0yp~!&IWgO-y zC<`FFKv4*{;7FV1EKsW{T@Yex3|W9#8rEmnZW6=EG@>MVQ~ojRFjxXYc_amQWB~wC z{ua~(fC_-cB*mFB?J)_NNz5K+8u~H*-BO=X$KQMp|8BDWY{!j;aje6*_r;J`)wk55 z#f!yHrbv%g@2yswvM=cmUq#u`Aj%E(d-v|GzSwa02+`xyjo+9h%v}`hZ>N;Flve0V zZ5%msYE$SDAH%0m2O(ZmPCwzim_DC87eAcBE2=n=27*r zrBfLKAIJylm&Wm&)jTspq8%kVQSA{Bg&ZWP-ANNh?$j`M#hKKXv%18!V+B1cm+uI< z`{GMi*wUB34cT$^<@@7rZrQS7?JLqb$G9$C{2mHOykE)=N#(_SvT{h&m<4vCdl;CVo7y}GXg_cyNs3y7(WdAl<*oXgzz(h zt{%V)%?XrRu(ttIaX|ti4KLrKf9gRW^P6v)Ew6~rSssHhFA7_+ zeurU)X#&jQ%=p5=T?cB;bm=FY*y`)TMO2*B1-i+BVhZHu2};)Eu@*`Ix5pqf6SD&# zGlqzgy1%K$$QG{6Qq>V;t3vFwg>zz3W19ao&8l#d*?4u==ulEJPWh zUjrV1avsO1`r0UjNkm0O*`kQgG*Cv6&M0!Kr)}EY-2#S+x**PY69E=Xj?IDuJ-q=b z$3tVJ{_0Bk!pQ|?AxoD0p?+po@Xv>}_<7ofkeRbi0KQkKE1?>1@$8$iM_aN4=2y9C z88fq}sAF-jJhf~S#!h>12KHbu>Q0#rv4)(c>Db;Q$cYPj`a*JgR-%G8k z95co3j(OsqDsjDIxwx8W76Z>K$W`cfIOw;pA(y_#nz>*Ob89T8N?rh3Wk`hEh@d>4 ziwA#Ai7e|-s3}ms@_-3w%pPz?#QHYjn;T0EYyq7#mJ;rXKnYk)Zfc1MM9^m_1%ASr z+MaEvkWgsZ`O74)Mgd=mUL?m$pM#M3XAB&uLk@Nog{_{YRuGmbHja;)tCn<2HNYPif zHBMTSR1B3V6f)rmu?k1R_!2jmf?F=3en2wJFW)xmV`gxqouxfZQcJPTo@QiJuNUx8b2(>lW_3 z*KK8oj@g}aO;359Q*Zra)SK$f$9t4?8MJ4?(rt-S`{u2yT1CF^cvHQj-u3@h{bHHp zcj@y(->mw`(%_vtm)V%upZT)L`(N#O_Srk1yn9ydw>q)CD0a4`=L6TqAa-vP{EHI+ z16!3?P1=hkDx>ik96fROEG#151iCgO9*Y>SuP6rz+OL8)UxJueQXnfS+L;)WLTA>L z7<@c{kd!!nE9o?B?)AVz1ZPW$dJ-<=G`9ph)dAVs6elJ5ig6J8f+?jK^aEyA_S1}M z8L^M;J8-IK#H8)*k8GGRnGKtj)2UVeBR`zHEN-<8o7!V=kM2Xo8S2w-v5xy5AF%I& zQa$S1Yp<$?z=d2zW%r zfhT+FZ$v$=)T9{!)F!*fqQocjOk40xofD4=PeQykJ~|%g+7O+o*_V_#E$H_a))vuR zZQyQ0Gh8WiVxV=2j=^3r@^8`BTJX5g9{>}=eGRpffMepVBx~acG=eMOIB)}JpE0+9 zTqowYbM}mUUBDNZV^|XKC((cm7Lynk!%p6O0sq8^y05doc~%l{eK8%C9lOgwo%`|} zHEj5!@DL~*bXYwj<~m-G(yK;S{jzpWRYvQo-`J&gqpOCqFNP4Vk%V&S6+SSBBileU zU~L0(k0uc;03U+e!7;`OZ(Q-B(+6F4rh&m?Zmm~BB%Tclsh|wSpQ`f4of* zI_J@FlARNf2^5p5Pk>9+=98&8+Ifx&QwR3WK#i5=e*8YDP<%Ka9c?o%er=}bCT$aw zNw02WtBtYNb^s?~;Ax} zoLZQdl6X{3b#!VL8*Ev=CU;^%$}@#4&N{Y>PsO*GzPQKOPR*Z5pMJJ{!oe9iEn1!l zX+31cz^t-X)zuNU^vo7R#)f5-bQrT`M5@%Oy7lN*gGaT<>eselU0KJ}!7B!~Ds5Fw z^QP(P!oeZOA#;LBtLzD0A?p9*KGIB6*hfai31~6)j3LTeX|8Q6UeWV!_X;)(^ePF? z?IOP$@!Ko=K39KYO}^N7=hvpsgl#G>U)RhLb7c44L+rJ;ehZm7vl*MpVz#mfHo4{S zA%P9=K71(P{&efEqc`7He~Og1N2|ZQLHr|P`EQs7M8mCB{GE9SNX!Qn;%HW9Klo12 zPdwycj!ECl6$O?dp{R%$$H08C^49U z;twyql$9Ty!}@l;cjfAd6IZX8^3{7g9LvXbh6u}2#k~!KrE@#j3u-PiWB=zhZj$!` z=5vwhvq*SLiSOHwKo7XOBgfc<&NXxy-)Yow*b8yAbQA~>T6!!Y8w z7>Q$IJrX`&5E8A4FdsmsjJA>Z03kAwi@vEg#h%F9vxCvL19!sDzfHYjOSPkCN~S%P zIv8iI>ttvg(GzxST~~w4SI_#|PS)B&V#C`d#&hbO1wA#AXlgMKRF#CNIN@BdS4o6= zad0Y~=+@BCEE7#KS4V{Aygb7t9-X`7~dnWwH!8sreij4WHccveMzhXvj~V|Nd;PU%u=FJ8;>lP(XC zhx`a& zH-kAn@JFDJdvTQ}-jq)Q9gBnZ#sXbV9P-JsBvPWrWXGUpMs|$!@;CW`FSV%-`t4ur z+s_=|u|Jm`40T*@BL=7crrxzlhfG2J7amqFIG*zpr!HgDM;(6J3z7#Dq8q=Hn_(O+ zg`L_sTwWA3D3|CL9LNnv@b1%O1c77(hI@EX8eMGH}B)$(=SQV z#5dI!PX&o1W-GJzIIlF#?LgZK ztCPgnsGW1)bDmo#d(qhUJok;awKlW9HWL+@4a3VMsaI(g&D}Lx**vtqDPf!k4^QEG z1t^#>O_;K1q}MjIfVanU4lIG|+LP*)_Ccoaz?K~i4czbl4e+B zlE?rRmKhoypJZWhoz4y?;uu2#Pg<(`f85)=ruxL1eaG0@e>M2ANzct&e{Mr=(Yc4! zH`QPK53+&dE1y5oqe#8c@KWdO#Va#%#n^$Y_0Gi$_MSRm7axB(yzIz?HLG@od2ia- zsp|Rvv=?pP#jIZQm~UzEEoQOhjar>g^NYM4klnwA-Y8rs^{9jAK_m2#K)!)I)T1t? zp5Vi048^YvJA%MSAU+8|5+(!^>Jmu;G>e4IkP;cWbsFz7(-raXo+~?!h*ujC4NP6Bde4C@~1`oDRM=6R~OCtiO z&<9WnRDu9|AB3j!dQ~2M)-;UR13*aFMDX7 zK*}=gV%q6pTs7T{xFC2~WD)@iBCekM^dsd^oRwCL8=UzDjb_Jl zU*GqY`Yke*-QQyJMs21qpl=Soci$93pAEJ6M0BNEj8E93@4bN7>V3|8vb1~df31Bw zHf#4bM$x^3cyF_MS72`o@3dqpUA$$A+^($Jv23>c7;V z)PMajxAX(nS7A|KR6KXv!X%%%=jBKD)eh+Q_(M|Z^z=5<#@ru2xvZ6FSqMK7ngdmA zd|v%Xn*+6pHV63RbAV64MZ+lh)5aXj+ZY$>6hRMWwQxf*^m~F;i|NolOxlN8`|#F2 ze6$aL?IVDH0E)GI0tl+1lmeEd@Hof%5Bq-hS<#1_`jOg|Mln3kDtf``rmFVl(Y0XMF?C9K!P@~TbqE9VBS zJUnB;)`%TVBUL;?~Je$(R8cFNeg|A~b z_bs%Jz1^q(FY5?Jrn5e!p<*Lu4Q~$d{%M0!DaJ?4eZ`BHZ{8_d(61io@*-!tzq}9 z0p0KgMa+aopm{qE$OsrV@vvda>quN8r;GYt^S@pd71-ly6RZ_`uX@5A6%>)jqdR@r**pc7roU zqwwXUhshb^TlLF53h_KL^lD$5)*yzvIk2rAT;(+-QsXKCpb&I%gph}0j&t5TA zumqYaum=zgBpYf0kr&y;R{pvEh5i6c$SHwtFyq<*_bIdkBr{&fYTmOsuulS2b4%b` zFv^B69>MqUNH7H7D_IF#+RU;kIX(#l;W@;7^O;4Y_1|C}c-BWlIt(#KCnB#oM?`u= zHo#XrQ(aO1$l;2m2R9dV?b4SJ4zr$S<};_&hMLWKB)w{;XluFUtes~z^;&&y*X-QB zWdk^taUhVMN7J9)Vs=H&|Exv7Nx(P1m{wwr10aF55nfQjZ0XcxU>nF*I8rDA!6dh@ z>tLv>tN1T&T?DtQfOVQ(*brriD!*zC(g* zZg>=C4g;o95>hBM>Ow+-JppUdJ%PxHz@w!gH-t#Od$S$AbW-x zmixT9S)4ySe#@eOPWR9K1+}xbga-T?Se3f?p%LtP$I>y=<z(*MTAnkTFpy_#s2kA*qkSG6q9J zG9Ux6P?7Fa03esb$%zi&=1Oy6*y^Si9EYEg);l_gT_!`oJy* zpFgGXYiSzt%!I?*HdzUdB^?gQr205H)34iEbl6eMnhNs)rXK?V_=LML6sQ4l6%Vra zCeU_soEj4kAUG$%sm@P*hYviBjyKK8lan6%|Q#^8cPYJG--p zzu)_L-@lUCo!ObW_nv$1xu>5Ilcx=3yO+-`e(zZR)K3SFZIm=tin#lIOsQS0qg*_( zCGotvA%Dbhf=e-t=+cYB}Hou}bwaS?m4Bm_f_Cm)qK%|``BXRHbw!KLD;`>SwP zU!OWock~nP2CSdxb|k)P+@i0AivS|bd|((wutkO{vBU=(GZw<2TFc{Fs@M`amy{Gw zREB0agXUHvB_z&jv;_JlG9gi1JOqSv*#9lhIJb*qowLrc$6hYqwdc%%q5b>jv7!C? z4pm>d;(V_Bve@?}wrjoEa_4I=AIRH%=H>mS5&08_jUJw#KeBSCJh^hSskCx~JdJ4d zP|)bR!1X}n$E*u)lue4zIE~Lg7bz3?G1Z0e?g$a0C^{lQTVEDtSo4^E0|`)UTFPKs zsuIUDXu>Jr6gdTe0MxUQUl`1`|%K^@eq46PF{BQL8cvnC>C35QBM zRF1C`nn=1SEqYV09wa5cslM>y%d9I~#JaqUz^4jT$t8BnqmssvwZ>fhay{R5~U;ODPOE`Q`{p{#*_0vO#SYnd;uGD+m z{CQi&#hp5A#+o?-8Ip3OT0tSUDQ1mA0M(-(MH_T-z%fVHA@LL44y{;4ZajjGNEXRL ztVCFeav)YZf*CuZN4|aWi2BTV_SK)vckA*IQ{Si>$s8M=-Cv@9!m`yX{(JWLL-q=AK5r`h;^wN$ zjZ2;zvbFHZjSRT+th!ykWUd4^6ax)GBDCQVn&m8l>_nwFg5$-}{-`~OSE8r=op4Ft zgA}V4Jd0XV1{<1Eqc-0pu(=q_l1gk?ZGuTc42PH9O57+`5%Ra0EL@XIT0#6DMi>GY zBiIZ>Lc&-R2WX7+MAAFmS$5vR%}ZJT_tZBeb;sTnPqD9NsuO;Et5sk1mcmY^>>E1K zR6Kgr&Xa#k{b}XpG-t8D*uAP78*3^>lzLc%vpIPRu@l4FsRN@{0Vl>t8{`9~mk>?c zKsce)Xqbu)5&NRsJ@}AyYQkq;KhZ&gkp{5SD|u@He5|=z==Dw<@G#Q0W@PdGRBqT*kT}aaYmfXM<7R9 zt>Y$1(x$`txqH$NQN^9Jim4_~tYhLf zM;!HBy?hzzAoKFi;aW8Oq6jtl0)Y($?k}=uh~Us&sZ9V?V^s;|ISZSH>Kb}!iRooN zhNnQw{0ygBkD&2^qzp49H~W(N3r?ZUf*L4_G;r9WHLuJFTq@Y-JaXh0AYvo9%I07!r5>P4PxNK` zK5%}0H1EHAS(du_eer!M1ugci4*}Lfr?MEQcHVL`Otgzl_jE?lKbI+=aVp!v53kM8b(5#Ud!43BJXJw|w zHq2_*IIS&N?M+i^=Cv3wcit1t^J+fWDAp98WkVeu%;t9W8h3acYo`RZ`z>-0j5Y=~ zXpviKOT}QgV`zBDWlh~StB(_rGMs!MPk)f1-YE>1hT7Ungmx3e&q&Wr%FK@c{^I^Ii6$#(7y40fhVjA&ilFg0m}HPU*lKXp zH#Qz|rc)&^LCA|l=_FebZM+l)IOaH!z7>Kgj4Bfhlom5(220Hq>ps5ZW~l@Q(ON^u z7Ej}XpRnXYe8>{0)aGwN5PVs<_d6nikyws~i?u40crKG+CE5|IlMa6oIE#c4rxb?l zUUry#Ir+AxJ0#y98V+KH^kjy^MO0+`V-oN`pjh;G{HnCawfYO;yrOF2ZcHP+|`|Yoe>{++~$xiOD3{ zg>-tPyffJ(u}t03wU`YkVtuwrU*&yU)ckPaQzwH~n5Xyc)-CtYlHPSsY}|Y9$>_66 zl^;p!m2a_-C#9dSO5>}Foo5=i@6lywhv5s?FU}s=s&RVz%&ay!nUj|6FF52+@_GTA z&*40v`Ugu}X%S#d+VUQNb4t$~8gxo9CF8@fIX`xEt^Y<)FE!HH&-ys2ub(92Bw0U6 z!buXHGzvCu4wQ8P_z877RzU!tKp1ebuV4p-up7!<8xSQ017>1{(y$TNY&7KV3{ZLD zOFBJcbRUJwPiaTEC{&a_7F^n`qO>hpiPCt@IS7QPcKC1K(<6`}FrNRjhlN{RMAY<% zZv#ejUbljopIqPhjemR@vG2(z)pOe4zBfmV%xq9UQ{JV0Iu-46Y3)6Kp4hwR>G?gI^UFz*=j|*j>V6OK5Fz0za zyI*?U)gGSJ`{?z|gz7&m38vE+PY0ncjZ0n%27=nzFR%1G!-D{f?PPkjb3j6tyZ>=q z)Q`84A2d@V-4QM7hSp=gD$F zUWaFlG4(|G^_coKXsfo@n4Y1CZa$`LPg`EF8;ED-^JflJs~jhuk*>O)+39&k7n1lK z^{xKH^t@>&;Qe^@C*lf%w{VA#>5xQLN*5k^wKEFs^f8^nGy8=kaVtH;4!WK><$1;n zb|djjXVWuy=78WMZs5->bv=XpS$aEOeZzQ6PX5e6A&``uoY1d7Q-Pax3b^2Ydq5p0{_CWV@ z%|%%J@f>(X*~#DETt7E!@4-1eZ_=K}eLgGr^K>2Wr|a~)B}jj+#+rZpj{E3$y3d!} zo~i%lKMnn8DMBzrKboQ+R1?e$|4Y}os~v%uCmwq?h;P1!p zz77BJJMN?3=|0OvcRyY+^dryJj|S++d%PccGW7%JCh~txLZuL`A65K$T(|UhU#EWH zI`79%{P*>MS4a3qnuT7!(R&8NU-Ad=;%3;@>6~gI{ltIotkOB)X`au2?=7MWs0}HY zw*dYjupA}AUnW%3Dq&X@_};3^D*vjEGN0hMd0GV{N2e%m@~2a4`vu zhzN$q3+mH`LI*7(a61&yf%XK^BKg0qUf;)tuoM=2mf82Id(><8*f0LL`=PVW@BgXg z_~b|F5X*S~3FH}_eOP_xy#eYQ$OmEytz5$*s{7t&;moWr35-Z#Qt-;oKtAyMLfkm#zdWShoNx9FzF589#P#!Ht7T7fE#0f;R*-`QA!pdaQBQ zRBLN%Pb(_;oV8xHig~AcT8CQ2Y07OYq8c1pVQojMQtDuNFA9!eN4x_TNT@dfWdn?; zEAV7XS2+B8^Pz-PfG!dXdP?w$j6yZX7h+n*8ssxi#`LvQPQKiz$^&Zz(1 z7u7_Xn8e=S(=3gwjrma_(3tAgQ!R#hVo$J?#f02dRjO0{EdSnT=@oxZh9{0HI$RT% z&k~q_Z<@*9wHa(Jt4mNiSG=HBK#m0skjp_cY75<66~#10&&$11H;+S&M`DbZHz9-< zL#(P25aNn}rhq}dTq(bwRyq{x7={9*{By9#n3GQ{mv5ZeekA%#6tjMFlKF04t2&ST zpnh44z5C);R`aio_gMJeli#XOtC!x{_LlnY;i_-Y-*%u;*FcjV*%j$DjN}{is@q-TT*ykw=J|K&}Vq+O7e%@$dqcxs(prYO>@%O_UI36fuBX z6GHe0H&Pkwbr6^hF_}u7OvVM0mP61-B9=UzgKS9WK)wVS>GC_}D?d4`I@fJrHA=r_ z;ZfyLhjzVk?XoiCbXK{#ot+tbh^4=^?Gj5rSbgW{0rl?vO~0sj`u5z;$B>1^4if|P z9CZ}Ipy$vTA5Q-`F~k5swjs4sBrNjUx8LL3^d$SJoPD!UR2DdYl($q)5F=MY_BPVk zRK#I_rPv=M-xhK&M?F-v4Hqh+4k=%$=7v$({-K%wP*ZsL} zHA>Br9=o35ZQj2*N8ZJ-+D z(4J%@+3NiAO;>;V_44MoIZ^o7hc(`IU;~R*?{4;4ZE9^G3#R1Zs(Q2Ohn3P0_v*jX zN4;-bxO|Yzy0>6GZmJ*6ZP+#&Qw;uqX!#j8E$=Aw69x;TSS=-T^cb2IP;%_=57F~3 z{K^1+%yZFpFSW70CwkL%fix8e-gHrOC0A;H80l}q1h&yp@0-jm@x9#BJiI!-hF~Rl- z%y%#gwq@AkrHEi#dPck>E1Y%+OCsi;Z0%BjXL}Gc-MdERU)U**Pr3HTFINg)`|o{e zKmj2|;c<=>ug+j`>fJ(?R&|?Y%u|tp$Tm&AD(^0-vC71Hv!~j*cMSJlFCM3@V@Tx} zSvRVOYg@-Zv8QUsAlAD%>p@7QRvp^?DaP~p@j6;1}}fOwuR(98kIzm#O!g&f5-73Qin zM5XVbf8%xmo?j^}%Njvmxt0OHetu}?Dfz_D_YYn8dyTo^EL!w_hsE^{B#@$aa1`b5 zuu@84ghM+9oSJ#)^Izl6n&5$JK&cG&QM|>NoQHUeNGsK%=2>u&mj_e=6dh$w zn+R6;7r0y~GaN}tVvD>(%>u_C8n$?6aO0W9NKzFy_twTw)cZ{MdhOo5tJm+9WA;gE z_x5W)p4YrMqLJD|ot*ZHdh;N&{~7oh3odziU+~eZe}CFCD0c$j^lWvC{0-K<1@abo z2fKkx{29E9;FAGmn4xAYjQ-HVl4W21rreoXF1NU0`td=Sc{#z12_4kmAuE$zEQ=>y zr}w#K0XWea-UPcJ`6n1S2dGp53JS%~V2r}&n3V5)Sz2DXLmckhD@RwoB|a{;ads)$ zAYKta*jVBujSmy_+E`>s;RE0b_$c^?8;l@$F?8zE_f@Y-?L@M~FrhX0e5$YOBeYZ` z7mgrjC3V@0wRii{3yi$nh&~zg_tax3T#*vNCN^TnUUh!8?vHZToW;mnALNKLcMx18 zVFYU1Tn5h)16^|qVVYuT*-CpAMNvRktnYKWxq$b=9cB&REf!0JR<6@>dBN>f zn|{ja^~1(hw-zn9y>io!y>fou{2q(^JLk~K>E%uQqNZ=oS#ikp*P-PzUdix{oV77$ zF*t4p!=*PA0?8)~hHhML!0@uT}W@d?2SHrh=}QJ%>lOae_w*^SJdAf#|*cjc*w zV56Ve)3jM=L)*@>{Vn=NC1$>u|MZdYO#x-5=%cSitoQpA>wYwglKrH6=tBy8Zer>; zpqYX%B;_=PuOlz62gPy#thfOX%M8YwQpsgt!xyjQH_$yJ&Hz;k@r6$#hzR)y2zI<6 z*1+LGyo3ylFgrwJ)iqoPLzDs~IUMj1xSpPAwPIXZ5i~+ak_Ftg#dFo_xjLrN(zd<3 zl(g-!V$9g(J=*SX-?Qz~My$~iTzsm1&hjygu9kG^jjPh~^k$;HN8F;ZG_HcAOI)GoeJ-DSaZ}fQ}JHW0)BYR#`GI!ZQtK5gg%-hm7OFh7tJS z3K_R)A%e_dx$xj%3Lr=1xb%th$Mr)eo@9Pcp*ohjedwIm)!SRy3v9!^=H>gU_cL?z z%loU*1?(@a1W{Tnw?vK?n=m|EXu5-0Of9RoIp;tk;OmAnrn(@Y=LgYpN}|Sz^qHK4 zXYIla_p_fnXY0>$+VO~IG4>qw9r?e=G6Pzvh_1R4v@b!@bY;3FN#2VzAio9~^Fn@- z2JNjJw^qH*>Z3}_>jX;?*d<7xf&Q4lStA#}mQ@DP)I29Lh>#c0>n1{o1O+}KVLtwMU$jQ}nWerajxnzWOoQFE7?4zj$`bmDs4*jsQMa&3d#RM1IlF39 z)rd~g9i%Pi&rZR!dtA>7dL0MqBR%V23?{^l>eRjDJ7Zp5RkNyQCuxtg3y%UP(XR9r zo=q}!#s!P1Gq2T-da~+ka!vkD%GB(Ex2%t!z-i{@R38A9x049(3a{40TGa49Hc8!L zXt;}~3nJ=lJS9b&U*YpwNAbW}(B>6n%g4;|#+QF!`a-N01{sZoSVF`ZhdMhy7ww%@ zWsd2yzf1bBVi6`Mi&*vdc2jw)2Ny7pdFoT*JMQ;;#zA-kq=7q>uS|TsQiFe>zCc!p z17aYC5|Wj7@L(sgj`K5CIA_jR{mtY1uTsB%AgSM*l~xZPZ^dDc{)?&n{lV^`hunEv)aSvyn@|fA*&#U(eP$I2%e<Y8 zj_<#&ZrIOKs%W#vJF9=hJDc%$>bxhtlfOoPr@ql+Cc?t3Qli5oG4|bwRL~zBn(|ft?Uf&zt;k@v5F?fnoGg&SJq{RZw zUKTbCFaVJjOQOXjiKm~d7nIvKZ%&ga^{=@ss!`^lr3*`ZO_3?APKvtWrYTLmx+AM` zPTyVEhE>&-BaXayXyLRjz4sm2f1Pn(h_28fokHJgp>MTf$fT{2Vz0jGIwTljAF7aQ zVvZzI5}BRX3}9Vc+HVaMh0 z$G7+C*0{w_F;zV~O^0YA+`guRdMxv{}jjIh^D+1#*Z3>B5 zCdm?pZm)zZl6X*kX+7IHdHsN@d;LvEAFN|f4(u~U9o2_*Rlx=m&i)_|2G06n9q4s) z2u7R{)^XOW1vp34&~vhC2Unh z10HfgP1iZ=EP)d0!)3KlxIKr)g+lefW9&`|QNak9C?jSrWq|FYTK5JL#`<|qQJ#?d zc|v?KZ1+GeE+62zK%|@rCHEP{8pR#hU?AazvcZ(vktYTlrvq{wiW`72#fC<)0^;q0 zVL`#7QnjvLy=FxPgCk?kN2fHEmQ7qCs=m9$A55(qTPCith>tm^iR~M>V0w?k6k;Nz zYrqsL2vqY;g|&bK5x&sK)ASDRAzx@@U)KDD;;4h#`t(vla(P3~)5Mc)l4u)k<=U@@ za>YRKFa#7U;acG!NWI>E&Ng>$N2IQ|MRGr9^8MBQoW-;1(N^$z>#S0-*D zuV3e6-O*X>?#vxEz_&P*jWA2n7uQx^N^@@W7w>A0&Oj7dm{dJqx+|ZC6{3NV2Dx*G z5~=ADp|64;4~|gxX)UNd{IoGq^0-aM~Do7Lyv|W)NYBG_EK~u?_lls!$Lp``{q)Ob=94h0W3S=?i5n_!am-0$ZU)Dl5 zzl775?%H)}I6k2hQFof^EcfI`<}BsoK?!XbK;Z#l^QswI#o7WJXo%V zgR=*(jjp1v>(mQ!H;f@z7^=W(sP`2i@I<|N)~hn zY%yXc8(mgDOnq`@dHG1z>q~LAYEx5KEB41cb(vYH8ajuK;(hF|?v&>Po_<1(V)4{u zqYircAnGiUQK&?8Go=M6jk(o3m9rrC4NX{A)KsYookm z&pHiG1Jn!B4ZgqSc=k69NPN-jK+@e!jcO@H*1Srg_c4+@U)|--4sT7Z2R7-(8D~qe zpYxQ|#CcHMsa{~MR!Y&^msWiN9(p$7#=nLw$PU?gqEcUrx2zuwr*4fF^9;QD9+dzh z>9*|a)1bWT)?Eo|D^2dk!ScAm*kiO+g)yM0sXOoT1U zzh0M7vzD}-HtF2PK75^ZHTMQyScNGHGvv(ll6(1t=s?j`w;Z{3-77zFdqA^L?k0@6 z^7nuM(O8#5e;#@vWM9A;6y6zCIa)4p?sd|}ig}HJeXKUVTEO}BReU(-2hAq*A=1oG1=o^QQCK5$E-b?96>NL{4W#4|34O7UHw$ zODJ$`5pc`_znpPOeJw8RGZ;>3lOyzNB?INO+gMDvBdbneQc&aI#H6I)XFJDr zA3nR&_!Cc#Y!laW``26NpKKYh`CQGG-3|CPb@r|_d0dl@DWSkIp8#LeTwqyvle|Sc zP7WeGn~)rz`Q1Y()*jABL?dlr64pb;3lTahfuR(7qsF6=-$PsDj>eH30oK41C72gp1)P>Ik!tXilbm}NsG9Y#TB1WHQc z5`f7(j6qS@E!W6fBSq({YT>#olhY=e?6P_GkZ}dMv&LAXFQ%u|j*3f=7*8kNAY*-# z;NhLeO`G^c-}!CT%cDlIi*ZQG9n-j8Bwr7RKaoK(K(Cs)bu9$*e<4j~z5$~osKIuF z&XNoRUWJVpzja2RJ14c;?Ho$p&rs<~yX)+CXR6QozYeVN)r8lZqM(|1pCXoTgsD#Jh5cI;020ZN?uapr? z+b7D2@TrJkelHwaJ$>mHi?^y@Tvb0*Pgjrb`-B*A^z|c4+loz2d{a}rGQMd2{jJBU z*RUq2oBhOd%R66k-iiA3;4_~?{)IjbbhzbUn~3lLzvJJ5Rr{@eczioZDVK79;D2hCtW(QC2-wNjW#D${~$It2VyS!E3$zH z;A=|P&3Ntf?p)EZp^Aq3jaW@S9^J7L7NC*6Eb6^hvciF3MMi|!9o#@tH|@nXy*k@! zim92)4nJ=icqB9Cpk=3Ycu+T=MM2N3tF#wx4m7}yiXKt1aek|cotb5yk!MYh!%p!W$;c+s6jfYQxKn^14tAJ>8Sn9}JrxAiM z1mkCBHc3h_4=TF7;d2%;@5{}fsXw2|tg-dn#u|@3yLQ!)vd-<&+jpMaO?2#4SF7)- z0edRf!Xvt21deE93fi=4xYsyb}!owefCUDe?aj^(G zIrECT^A(8UDg-MZWmJX`1{zGeJgf;^x)#_pLaJYNU7X?kT8we7Bck;bODJajq0^}A z{FCKN8aqw4!4dL`duPfT(8D!=D{}c#cy>t)jHm>6+c)h1~Q#+w7Z$aL^YX~GhvHm^}{;0g5IwhnmkI=VhYS6(W9 zW*%b)o*>Y`VW!pOk(_DX(rq2D^`)d}Hz7}qp}Y~u4QT;ThX>Tgo$*q3#UDB%34zJd zmy{&wv4~BQ#QuMM$-+L{_Wk1XN4BruTg>v`9jX5CZHpFT&Q5!*Tg%x~-u~eE-1Dy= zD0zCDxT@pTlH*^_yfSZDanY241!D@HnNoJ6#<~SzCAFr0&1y{AxNLjj%~{%d?8o6k zdF93_60bR|!Np5|#y4~wF2?m}Fu*E87}u@AH_+(v3x5La;RdA{M$g3)KE#Hi!|ota zO3tmik^lD1g60^@=>CWAzBOi)B*l?nXR=r3htIm&6`ddT^#nw9FWm!rT6J1JqP}E# z9dyJ7PgDx`L7X;}b^?#1t&Wv}& zk8A$q!g*UqpX$(aUyocts`^weQ{OOuECe8KxVA9TARr{co^9-H1YcLM8E5;pj_4UN zG-67GoL3g;=kB#)3FHvQLJRU-MPOc8jOP?%fh!S@Qlhwf?i-9GsaigUB)h%p({E?a z8tnP z_B<<)_uT_P$OUDh2k__v#ai3c1%J+GQ_VBfRun`aR&AC8)lWGr!i2{Kq?_h1%%5@8l^58UHK_aOgpjLTtO3=cf z4MEbhQ+tD+3lgWlcsuClplX~eK|yT#i#>ye22BZq-*z?5%9y8zWFr^J;HUTmaW`?W zE&df`fQ3T=jv*CF7~_>Ia2M6Dq@c$P3Wk)@t?5Wf2;CS0BGqQ?3fiq-{L0ayb(sZ^ ztu1=?m8GT)w{G2n-PiwX{HNYizvkL%7jiTO4-C0CR>*B;QgYJ0$|_|_(=h|};> zl5d!=IIYa==`@T@oVL}*ta`4JuStOCR0;B>cPLS2mqH6fI7G`4 z8e)Ap+xX^>?K?F;XUJH2;(~$0=k_1AVDzwsroLUfwvk4Nt+QKq8q~L2?*!YBF1bT! zkE;3#xc3U?$RDvCe2(~r`|ung5i1{yIW_8(WDYZ9EM5~pc!Q!Od_({;cSxYfQXRI= z1CJLJG~HHI_6EUJtgAzlRqaOmhtPfyBm&+(-yErZ=7A;cdy)q%PTJTE&{>f!` z?ud0i{~UN)U0robK7hHsje6+TyY2`!ofN>E#N`|4?wbX5C-@w2X8)nS5kLQrzPP9m z(IM&qyCave3mPdx`)^8T(Eb-JNUT}8*l)=>cO6lEj`cp!z4FuQao*SHd+xsK{eWdf z@9P!7@oB*E5qG(yH_Ge=X=dO3g5TOuj3e zaME6YIV)4AnLmMErL{H}T!(@_@QL9P%tI3c4{aVH9ssuw4+v zsx65@BYF($(`Cw*6~Tp@iKnxFM=#t=5dX6m>-8ww z8AZcK&Il{?lbiQ+^z|RzqP2W@VAq@{>JF`I_w77%+|X~krQ7U1M>dG*(Kw+!;kyXB zcK|f`HqXNIgf=dn;&@SItL|Ozl^lmyL{I;f5G_su!}tecxG+PL{UP;B36}JXBe? z{v1Da8d_#pFsSOwquk&DX522JQPwuD8hp9>6D^A1r9&jGqDY4G=LKV~6z$ow;L51^ z=8q?gRu8k<>VMe4(Gv(x2f^=LvRr`u(oU_r+_bqZ8&a%NgWIx|80|xvVqyD4YMadmSq~9IlA-GWz#2*8$Nu*%<0RPb{?JCXTpSmNuBG} z>ztIAj()EI%>HY+4_X>UD?S9Cm7ZQGK0JmAj@0lw_oYzhfwWS@JdzMbxv$h=6W7)lP*9K?xO&{|^&4ibUcE{_uxu(Z6=RBa ztXWtx=GEuVmZAR}<-^rO(SI9cmTl<2M#Z^~UmpT@37``Y%V-aQQsii^|A&Vgez15t z1~)hQp%7AL6o?u*_hKLh8IrsOVm&V+!k6HAoYX-{UKAu9k|qtyRd=jxFY4 zn`xX9lS3p$tl9#6yM;CChgI5Hn^S!njbs~!DL!d%F_J3^;T0D}+ozeYO<*5v`2i0h znkKCvb&Dh2p{6vQ-aMn|?(FZ2{@mW(l(~HQab0Ze zCQfhMzV0+@_Y845n>6+qtDSqw{P8`@*cpBLw{IriyqS?b{E2C!E%$!k0=NZ%?3dooAB?Z@u3o z8Q#UWIbC4z;CO-AhKg)OkqnY#;Udo+(54H&%bo zRP{v-U*wNEjF?cU9?x4spRCVdwZyoV^f9zmLJcuG{}+A7{5`UlkL=t(I>pzb-j~*j zWatZDemeeeZUu1k3e};^aULL2Tn#cLxZTd;C9dhUicB(9@2T}wB71;{>_v- zSUpiVVMK=|d8{veYPcp11RhJkJZ>+G<4NTs6M19NsSuQDoP@q z5*?w8#Ssa%aK!$FBX%wvk(T&*Gcx6*Xao%_mv(C$gZ>d1WF}1~Y-GmiAeTccLU~iY zEVbd>;ue!?41zC3RIr_5sY+wv_{6JN@<1u_{B$4!fY~5NI$%-&_h`k&shOZ8{nN_1 zfhL)fgW}{tIZdmb2d%yPhCADXO*{)?iKJjOA{ z`HTAjmCMKcysTk-?NmoSQ9k7VX-(xK&P0tDm>3>bi}sTeocw zXygbJR3i$4P_6Rn63>o!CYDoY=-Rwv9SOqjc&NzEQSp$zjl~`b+s+^fL@G z1g3DZyJ&08E53m%hG3dEDx8sgG7>g)gf=84!JK3@Ly$y|Hg%nApWM1&!Y|8xP4P1m z0s~r01INv-9owwU#IWFL%E+df?OQZ$+SoL_4VuR~?Oy$({9kjN5M(-GN;hMja@eJa z6Xe>+-4g_j4Y>%415)kbl(!t1x&fAepO4 z2Nzr*w4Lp9=1@Og$3#_Stu;_-N9hH%AWSV_>)8eg&;qaJ4AS=r>~(CQ*j*|_Pc4M? z8chU~PO)E5yhv0z0t?jSK&XNvQS7ePOJW};@gw_a;g$sp7i@+;K@z%D_mF0pUV;1> z4X%5pQrljKXi#k~0OM%I`+PJUiHF5DUMI79_^h$sQ5o}h518@-7j%oeYC~1}598d2GWlm_dnA!z^YLpGZg|IEjOO`-$b^h9dC-J6L{jT-Uw* zdYk*?vSAvirfAGVoU4Z+r$!qjFK=?j1zw}nGv-}bqOAK`EAf{2aym*$_b76u%;5D zB6<*vb^x&d9LylwMmKQmP6R`~G!xz5!a$`*YT#qfX`ic!2Fp8LJZ!S-)2S4rU!BBg z$q)Uq0!tbQ^OPtp%Qq4|f>hy{gnpqGsJ2f8RTROF7o}}Ir-bm}aEkcwY{1xo%6tr` z;2W{yY1gbMfl36wfK9hYVa=C^Zl8(88!CK0L_tO)@Q{;e`JN_%q3`U~s(_ z!&7P{H!Ca{9G{V&T05ob*8>+64$3WB7}KtCqxO_lSBjaqBD_@q4*&_t4r-WxBjyu{o8kr}q z3CRv@+faSNh1Qs(6Y6i$NVwG{3By&2T{t2PsGd*z0j@J#cL>ATtC%&4{&}r>KE5HJ z6Dqe;&ODRQz)RNU=28&HGDFa|B5Lk;6lkeg>Dl$OTF7V!Lx6=p4H`eJS#uMN+CBK!mhiXFIQL07T>Dc&&QD?EJBQ%42@Ts zV&U2dqEkp-%vD^FXAN*6(q#xjgcj(`URgBc3m!HpaytnEBL*+?_piEd+^Ec!M)l&cRly$ z?_r&c?~}|p*Y6eeHpS2A9=X8v%+LBc?xpt^;GAetv+6&jDe%*(i5+p6;;Yp&grh`l z&?3?kcmUJX1J&(u~>d2RBBfrE8no(Rsky^dpB)z4hjSya_WV z&0E>M-{72F_4NkLo9A*?l5j%~VMEMsfHpm*)NuJcVzZ>-a4T*dNc`9y4F&*syBKYK zKo8=n5yb&J9_5EY)CRUrdrqS^akls+d9jV!1ho!bF+`r~!#WqDWuT~J%!YFHEh+&)Tq;vb%!^N zzJzu`BhdI$pjYI7tjkT*n3sPum%+)6R@UsMpdbbnOCw}4dIPYd}(9Wg^q1;tX2gb*bpfXgB< z=NN+nbqAu#QJ4oo!u?V9ct1vJ?vF5@lHOi3v_(dWjn0=39P&il$61YA|7CLd zku~f0XDnnhUg)p>^5co(O*eA8=5&2*-GZ#i#gp>ZBsX3;>d@O?y<4<%#)x)3v&T<< zD*x#X2fBC58J`_hD{OR!j=jjX3VeP+T;o?qN)X1FS{@O`jL8dtVNEf2F^cS(JGc#i0oAw+IJxX`hxc+Na6&yWEFpr$%qlm%eIO z*4kVbwv{@HC3lcpX61`c_pNRMiKz*EIf(<;X2a^DCxM_Tu_B^)ICas^D5wX9Z3{W9 zwgUN~C;s_)DmJn9@NTI&akjXy7QwOhSnXd}>wwqhbw%bjeGV$*sqP`)2OqhNTP=R*Fpsiwuv|s8Axp__l)lKCtBQ$Pgt)EA;{=_4*!+ zC)opj!^WDCaTSWq%>6j)@qW}NIR)eab_FCi<8_C*7lfxCF`(}V$;?Wm7zLCbL!J#w zi1c>*l5LL#ZQFMI2hvCM3!2O==sF)=+244}HyoQ-^ zEC7W^);#f?SRsBP{vvu}?{n14Y^?Ap{Iuf~lPjMV6>c$X##jfGiX|&O0(FIfL^`~)i}?xlejnW1pn-(X%fl~De5eIx zKZBNf4A)!QL@l=a04*}1zq*;nr&2w^5H9U#yoFa77O$fLdafxjUlf9ZgW}=g=~7)9 zYpavsXqa+s-9tt+1X?K3QM|kws=XTXdB)b#>SWn;0n%b|kky+DkjR$g3Nn@FuU%5V z$1`p1T{|?GIAD3VdcBWj$F2!L!wJ2d`-Dc zLr*lob1{$y3n?S0JhLozx})CxQhj;*{&m}roLlt$wp%RZi$C7k`gF;G*UurYKK#0J z@LI``FaQm{wZ}U7bqmi5UJYr>%pr`ZaQBB&|I6>8M z%RRPefm^QN9AO+AtX*DX3nS_BlwVM-APDOiq7ktY_!~~i3E>GM08FJT9~!CVGy->9 zZJ==IH=9NC>F-{?v~J?`(IXb0`R4Ro{O? zx2><8UOs1Q{g^)8I`*45WZ1#Mn7@;VS!#)W#2@moudWXVf60fX&!3yKHIN37bzXRg zf~k@+LfB+^hP?^v+@WY0;&*$^@!uA{WxafW67KWAW}xHrh(V4nC@^bV>Q&4-x!V&|RXE==RTVJ9lox7D{R*t558mERGsIU9(L zoma(o&BYZJ*he~Jouvb2RO5K4QbWt)4&frk#nXDhPG@j=-`vrs3DLyuDmAnZDS-!& zgw#mDMPoisVxF?Hk|ZfTjNHV+(xE1S+z6QrQe%>dxLAk7LKs-GcIW<)(=U&Iyr8K4 z_{%ef94yM1HR;X&zLn1ojbAuo#ijuZS(lYdmhWW}%TPZ&SG2es8ROpi?Rb9U>5Iqh z9+pDYp69d4E}GT#R3b4Hn2o}RB4&}3(C}QTGY85U;pz< zS;?2{H@(`av_Rw|6E}9nB~2FUak1(O%{CbNA>$VUAN^g;UgQ- zvE7DEt-AD^KzT_~pW4Ta+R16c3`H`;XYmM5eT^l9cTLt$bfUs1P`AV=5(HQ9c-WJJ zJ)Du6Qffyei16p6NUY2ZEDWNUl-E2d3C1nt zbPhpIXVb-*?{&z2ckV&;ugzPS|B>UL4lkXua?iOvE1$hNLYaPu`E3<9tA9o0^y=Ps zAFK5oViH)*eS52g52_d6m|eVvO;$IrDQ5Ef)r+sq+Pho5ds6-NIrW=;fW@Hd@697Y zQ|kj3p$!_k*FGmP`r6{mihjZ!v1z%}64dPm7@Tp1k%r5dQX@2+Z^pH`6H=WDr7k~* zjD|7OzL9}Mp@h(|rsB^PCK^E=27CkI*3(FN&e}sem%Pu+1z&7BHG1^(pR2#ky18b_ z&O>YShOqJ>OFlXsf9&HD_3HiF#g%IY4Pxnk#+KY)Tk`RXamPOGIpELVa(e-%gON|+ zG}f&@EYHIgN|}Qhgxx5>wQjxWte(|G5jE8g_lz_~>%(Eq=q&-h{b5ZTN|2J44c?J9 zhVNYD42FIr_h%-n>Q~O2>KL32UB7qxTBKe%`OU>Qzn7pNJ>vYlWKqF-5%f=lehTy% z^pE;HL=m(;>mBwAfahK(ME3+gT^9)LjzQN*Tb#kYgEWO+szHXhT+;TSyD(g zo9^x;UI$|^x4;-2!g~2ze*JqswxhTXCLZ?LIOIc>;wkSDiL+#PBLw4QU0;S?fr5Ix zHNTCs05ouu$d?>$Sp~A5e9u$$>YGxcWXqREkG+hG9$gEzIpe}29atyOn{gKLm$uD$Yy zcrmQ{e$MAwmmZWbE2VEJMADilqq74|yJ1kJ@UAs*br_=^YBQq04p&J7s`i2?io~?g ztPB)3Nf1$yJk<2rHJ`1h7;#+vbBnl{`5k|b`D~OvIDfwC&Y3Gx#mg_gFI^K0-%)Su zdX_bPZ~O2REEYLib%BV&>ZBKGpZOL+Jp!MhD5-c0@5tFDQ%iy zg*^m`31|=ErbBaHxw<|?{p%`1zYzw0iTOpa8RZYk53gN!h(f^GhoHWQ`3|56@XAlv zW#@;dKKcADM1Etew5D%jO$R|YJ4XrDbhFs~m}{Q--lDH*&cx{_UQC?Vz};C>LNt{m zIk9_oS<;rkTOHbxQ2sL}83jjC0Gg{oDfb1=O)IFt=%y;H(8t)&BVvP#&K~Tizo@Dx zuPjZT*hbttDVF;m@yX!9ANrgnf?r6~Pu#iZ zX=)SjOM<>(x)~;xz{@M5T(3#1(g>1;a1jHoR{TxmwOI&0H%h6c-2|s-gAfKc1+Uz2 zKzu`PI9kncMTYBl5;^N>8Q`#axO2pLd4I=at7RQ7)c)i3^E0Pu$=_bSE+?H2L0-5u z=c6wmOGew=9SNJ%<1<;ovJGOt;WK!?x0jz$1Ca{O-gCw3Dc>NoXrIB4-+Jo_3i*cw ztmQ6}K;mnFOEzoSi$Huqn{oViS5QvLHJ=+(D$;aub{%`Ifv2EVZU7bymcge@V(`Nf zJ7IPoRKuL|^L=%pB=>giHI-^JTlon&9!cP61$hznBdu@K4Si$0Z=?^R$>aQhKCL=> zLa)zzBqKeBd{q`9i3iDXa;n@~mh=9lyAY24t-Gx1Id-G+5Sz;8zp8#9=B23?%3Hvm zVHcc@<`6DQ!WOKl)>u;!@RqZo@_ejjbp|%VF9Jv1$MfIGrq0apVd*lP5*p4`?(j`X z4P|+xLllrPFP!^Dqa3ag;BZku(0im|)j?5Uz($$^n6t3vxbrGLpx1blYaO;S)D5@RVNoNjgW&Qmn`@#h}A+;{$zIjn!14XLpfynTkz3! zaYfZhuRKD@+YAA<33dS{BappUx~U9 z&2Q5)YA7M0JR?m=>Z#O_)*+-5Kw1;+8hl`lngqZd>(yX^P-3+E03DCQ^k_S5%zyIy&C)>Uvxm$bz_I8F6o&xqTwyaQ0qqM37ozQ~zS zR~=?b!x|418Y|4@LqIs}HC3D->G?7AWsDx!Lqrj}%}~hE*zKfdr(3>%dh6NW2W0LS z>%FF4RENnQtJP}ZjoI(AKiN*_gB)oz>1z}4!z{o!P-ykfHgzyQvQ55jbjFN#z|1>< zKsKbB65l-2;&9QbZEv<|dXiO~`$Zily>UXlx3FLb8~xi?l^4Z!guAG7t?oCaV9aEX zlw39~m;KfYUA^=v`qK6Cav*orEY7|X3mal@yZyZQ?uE*mC-$3y9{gwudyu2<*V=5Z zo|SDJuO5G7oBFVMoBD~n&4<_y(?iWRhgRkH@~RIG6-x)I@}vWm7uB=iCDPO#mQ0K@ z7~Jo8C6rs{K~77}pi?fpkeBGGOL8Qz860^@U^D92U??){=0AAAL8yTT99AeCFnNXt zaPsMheFZqA^vuw#FbSMJY#r$y29&eD*%O08g4nO>^L`<6vtv#l$`y(PnKyc_We^3b^2Gb9s=f+*ONFC~ z9rF-|>|V0L*VYU8+@W6IC%AykPrPRWRv~~M;Rz(+#!Z8Fgc1Xz?>$GID$Ph0D#hR}Gc+tNH48 zznBilHC|EKRlZii7W*s!?1GVB5c)mvrUo9#i-p%uyjXZoM?urv{5;cKB*5GmT$U6q z0R-w@QrtP^)FheI9ufx97KTqPnWmKJynfC*ktV<@W_jn(WWsLDc>Me5G-U!bDr zkPfT*QL0mgMOF1Ozzkgp<#P3foSY;y!38*1ntYv0upfGIh1Ei>*cpnDn1nXrij64& z=cY{tr&BtjaI8UZy%dz#$P7%J63f#j6e7MMN|_qVrk%=;&51=J%!=4A@KJ`v;&G|; zq;S*pb(#+aNf+Uf+{utQm?zG4(=fl2G#`px1mUulEBLw7D70S zI@Ks48wQ>-hi9av3A`kZBN#>DFpFAMNsqoD!r@jEP%=BWOR4*d$#E6e)WoTkjtMdSNjxC+*HpWAuYma(jq*op1mQuv__WQNRl=5F=#J3@NpJDd|~ZX>C$4 z)Xu4miicBc13M~ee}V612?k)nO+KkY0~zV`1+BCt6dfT}O{L(HK&|9)MHu3S(;${q z>4g9Pr>a@~=ZZDs=!M1CMxlYJ}+PU;6m^#*RH)` z(E-cdqKknnlBmDS0Kc42t^Za;~@QvrDAkQVTH)?q*C_!H)nHwXJ<%o{R z6+lOd;WnEQz|HmOn#P=zlP-{BU3#BMUcWKVZE2ZaCuCRh{P-vbdUxQ9dp6x)JkH7d z61oX@>vdPE(#pU7s=RUK<$0%@H-BmF6=&nq|G9NGz4FSumvAnck_QgT-cWz%2R9M2ILgww-zBstBWM}1& zkoh}`m*V2iojZ&0eaE7pc{|N5xF2@QmK3eppnl7i&OKgh+_lu5yKt2vYU{f`!82Fp zOSc8l^fa*9CLmW6X;a|z3l$hr2|z()kYIpIE@8YfUoPHV^^A0z=b)*tUKf1+ep;2; zWpf62Z!0`tQ-$Wp$<#*}DtsxFHs>K0HB%{ZS}KmDyrZV@gMQIye?5uZ1Y46n1&K0GdNp)75Q&F0e zTH3v$v^#GRt8hqaX}^lnemrn*a7F3h)Y5?!r32w3WP-8LYIh)gv?HAikNS7X@SPdH z8}Io)xn9|}>8vT!XS8TJbH>ye#_#71*QLFNlct96;)$ksY-Y>mGp0|Om1_9TkluxU zXhA>tk1abjapI{mdE2)2V~a0sD;$2dSZhHmm7Mz2Jm93-%4FzF^EVKl@n ztIdLc4qKKZEFF3N5hRM$WMxk*U&hSKmZ=YxEm!|uw(PAX?bCa{XcnBDMNGbwTWj$;X(e97GKhm-X9sp&4JFCy&(Ghxv9v@KP zjbt9Nt-QTGYI?+awDjogG00<*hXrvhUH_3cFW~m0#%Merk47t*YMJq(c)G6b<>~3) zM7|Og^-AP9^@V^tmsH32pqQBI>I?3o^4;PU?BB=m34vioPL;MU8Kd9GLPGTi;}{3W zbbwrP6^kRJkK`Yg5J*)muw`PBFsvw9Ot7!_Ts-Z5aOWmrArbZJ2Vb3K9#aoNt2v!o zSq2Mrx(V>&ftT_!_;Me7_dwLMyZUq|a-j~X4Y)=e4injX+>Uyf7dV}s6(}ea%&b!J z7Rw5&fHpF#pho2{v)U@E(GgY~m_{z293o63cI6<)GZM>FfZ-C&Wr0vw9joH@Htm(A z0<}jr@i8NGb6fbXL941K5W=ck21&NJVO1L362ffoDIM$jNnKUCker@we}`69pMxy{ z5(jehJ6|2~>{kcR+^}Q7vZWp49^*e(#~YW>H>GD7*5dK}wb;~k*e5vFp<99D>8v~n zSV@WCO?3^s>v?CL>=-b_dJC`v9Mpx>j}F}kJi?E8a-J89#NgnlUWVZxE=tc~FEk!^ zS4xjfOo~;%OqBNa?)@d}q7=7n*|IHb>wG;mcLIEZ@?`+ocwqhr9{196H%J)C_aSL4 zy6eBnY-D2k_aHBLG!}W;IR- z6V5>g?sQtcA;PNVV2=RCix_XpY8CH*$XIn5i)ZbfSfuIB`F*=eu9nhl!zfNlm3kVGG@%KZ99!_8a z7jN;%24&0kkqwyTtDNuVm+aoWY4zIc%5CMR#~bb0rI$D6?TXKM`}C~EnO)xdbK3Qp zi*j<;Pdhp$TT$NlQn63EJb!*3N^_WLu+m;U4Zk-U^ttJ3Xt|2g;sdBdo$MfnL!_Qba3a@Ngi*(p|b<>c^%?bK`IT|dkvbMBE7oEI}*l} zzn2rE_^`gjSovlm?2@gCYzmz++^vb$V+j=-jVg2)kaAE6pEy!S{jDgge&P-Ei9S=0 zvN2SRA)$dp8Ulz^%MgLuEL5&IWg^KMMHtA9#P$0(&O2N(_p4=3Sd|PGR+7WYf3m+X z^m=UnrLg4ZA-IcYNsq+F*@bss87$Y8zC&P&%u8!?KWX0 z!5aetPiSg;xitH{9h)P!}p9p};EcH@N zwwarjc1&8=FD^6wlZ)n3HZnb~X)-GvHmB*UyrLq(*1$LT#(j2QX|Q>r#|W9-P#P6v z*#s0>Fhmnf(q5?_2G(p&6B z<=nDqme+IfkJ79uqN~u5?y`nTdzV7&No`Xcv`gLihQ!0VYRzbvdXd$_!fR=pz;%w6 zqU9t(*!8!X%xdv^XcYehdeA=22B1Yy(fz=m1BC%6Oo7(G&_HntoKo3^7kkRy0iWmcsc*2mlr)IEk;|B))=~@bHmA zsIS)@-0Faa=GYrf==sWQMJa8BZ-qT#6N=XkoAwW`_75!oyqK|AHHFDd6iQom@B9z8 zA_2=j&Sy(Hx1J1)V`=B)0thez^8uEooB5e znK+=!9FZT3KuHKWaA7vO-%(pe$|RX2OC5_t_89Q<)++U{_hUm4=vul(oBVy<7g|fb5g+RVw_Ijq%DKnuGF4f7F64_66jmCZ@|;d3}%WPS?oc z>Q566EmbGmEc{wVm7wlUA#!vzScM2(VwNs~2oQuqG|?FcX7Rh28YMvhl8=??lcFb$ z?Y^Q`v9d+XQZ}StICNOplh-`ayT;3l*@*191G*`##9cW#%I%!@-&LA{ymel;K~p?> zDrknV&Gf2aUL054+J0$e9pta-c7+l<@Qz@+>v{l@apCJDBau&1g361RMk@6hzZjm# zI<`*FWM-d&g0g2XzvPwcw|<307Y#EtLNC=B@YZT-Z^-5HQe%y`TAql)Df)H55Y%a6 zk^|04E(gFY)|LUriD#4z8PRb<#}{X0GGdju%f56c7P326$jHGu3YD4WJK#q(Q-8S% zZ&7simKd%)E%e9T22E;>C9hlu*u1LJZdUehFrR?iQdHF}g@s4PBumJPBt!p&6`m8W zm(Gi7pj=iyl9e6V?U)a1_ttkp^|FJw;;3-s$Ht?ZZ{6Ri-Nu!jTZy&naQ-b<7E0&A zziOB*<@=m!R=w7`V;jC)k~`%#m%BjN6>bh(2uBZ(!76sT zkO77*FQOUR(4QoG6~m;+!}Qg?g&@H2^;Z=F!6-XrlI(x3338QsCx^Fe`f}ZBE&8Qo z&X}&$mqwa>p8jV*gM{jX8%!QPI73=ffc4f=Zi|KBZxF4QV~;uIg4cg*{B^FEKrJd% z)xWRT&$wQMe*>PsUepqi02eA7j$^@XY6sJTQ$_};Qe56&Tk*gQL5x5{JtK4!7az!S z0AyLMjCqdj#*H8CpgYYqU)5amHI^6xrB^rR3d%~2mXXayRw-tER~&tti%-d~(Hm*Pe@BA>&DW^u@>zpCIPY^YQXx7f1wZ-Fw8k6&DT=gsPR0n zD~B3?^qKvN&@gvV>qYp-EjPI=yXUud?N*5RFWyUFTuNOnKW}y>oyU?_p)lc_bp$xkB=Oj zI(+z4<;$;|7AQ-n3>!9uMh`lgPf$tp`K4o@-zEKFcGgkZppk>&g+`f{$`Z6D>;nWy zkqyLGAj;w^LIwC*8IOjm6wWyEH+0|v_+2@K7Z4%GEpH7$F6w3o8=wz|k!6g_Qin)G z4}qr&_biGooPX35G1O;A>q)WlU zviH=zrSxURTT+k+i}F6qh$Kq!@WaBkzB8}jz!GKKbv7ffW1lvi%?E*?wf?L1gah9H zhvrS=si+!wOTgRz3F~x6Hodd##j9K)jL^sG9vXZNzHVBosG1-mkZ&tiLd({z6C9@i z8Sf3W(3}sxt^o&crEl4_pcHF*r8B`uD?f^Br%v1;vJA(fSa}ZS`t(Gex29>k&M4A` ze{zQhDJa=p#eH&*E!ygS)Lod`%59MQB=@=QtK6k2tvq7gTe^34r|+17r>RQ{!SKYb zgAOWCiGUD*_iO-{cK89h&$;t_KcI9(F5MumTE$Q05dLs5A3Do07o<{NSV_fjkYTfC zji|DGL>aHb-u_uU61LWUs+5*21xNN$*UQRi= zuW;-D6Q&<31@)nu!310<6oVl-&CP0hjgIM(IsMrFWo=s?K00-oFe4*}jXc+B@W|D3 zAp>17ca5GWLRMdwtEjSyGz#_L*&O(|t-P&bs2C@<61#|l#mOSF#Clvfl+^riMsMzS6=SF@4F+VvZ`3M`>~ zn7EPI%^x8D)eI_$2C8G-!e30m_e5BxgXAjQGNtqnts9NIYIza-U@^9puSqnnf1c=O zqyP!s|H0Z5bWBBPohf|r-LhsJJ+!24^P_L1ED`=1!A7L#jXd9VzzDWs9^X%K6W0DA z_OpR(cI+qW_@OwhsGX_c5Rz8jW!PQ#79N?AwJ5bne0HJZ;E{Rr zZ0R{_?>G2?{{Igh{BTqGfkc=I{6Osu+!si*fLtH(L$C^=LY&Y_=pqajCJXZf@I${A z07mJ@b}9M3Au3^4OV4=e>Uj?yZRgC9E#>om%@#t*tLI9dSY+aOuc z-Y^dV-=rH5_g`{m=~P*{be?m@I(I!&GuIjuC*(VJ>Xmp|R$Z&BCSHDzJyUs^q~j&^gVHSyk>;Kp?HO3C%8TVWtc0XgJS#b= z5e+J#jr)6Ny_N)Kj(r3EuF%IJAAoOF>5}ju)P&H3oPO882#2$tn!UJTLo-K#YbDuG zpP|x|Ae&U#&^<#VMz*Let(NBqVMXdU-eudFaFCfzI&1KZk;#9=E7M8l5 zncI4*_zg-?e0*GDVq84_bou9ExH7SJa&qlj$;tfQ=pxJ(9-8a? zl)`2ZQ-q(SZz1!T;NX<`V^T%2DU5k-zO>^_4q&ezzk+VEjAG@pl|& zj`y|VtWfJ&QXqVuWZ{tVp7P#rDZh(fD|cA^Jx_!v``zC;-$n|vS)|Kbe7|0hEvk$- z_~yJY2zZ&^aD$)b^H?gF2J04=3*Ay;0;X&^ca2$d-4DDG*B~}NKDI%ectSLnhr}c& z$3!QhF-$Ox6teN$EBv`FbN)XTl|nbBw=3Ag0U`?^B(~RkXdhy?v9KVklAtwC3uPqSrWwtQe-;WOnRqK}BVZD@Yt$tL#TDzBp3)Funn7W$A z3xxGX&EkV)3(rJ?jfEOUk>>i#t~RkQRgvmK&*VVs5SHX1bVcF32E`Vcf~-NvsKB8z zpau9kylcX#r1ZR4>3xshr{A5u_Gn~b+LZxJ_iuBdurhOKRzJ-gbA7PV3*Ro&Ngd;Y{~$sj1NFg^_*dcid2`N&L$ert~zv2YLKF4;C6@pRAZo z000XvCv*-pTsOVi!d^MRphy_0e=#u7qGA*$2n_~a?%I3Fq(duPUV6K~xvG@jDzn%8 z{N0Chx-D8II-bRLvoAR>>&t=;laL4V!9#sS9LIxC`m~V1a-=>$GxM4_w94NbK6&D} zDN_b@-M_7kxPw{RG+sMq_Vf{}+l)(NplLty`xu1>Z+Mg}=<+mNjgS#a1acr6?G4{W zEg{a6{ge=a7@Bn(gI(vYsvHZ*JiWYPg^rPK$y5;v%|}ssKNoTP%om0BEm8+Ddw5BS z@OkMWrG3bHpWZ`6lO5RN_LaiazyExLfOC)!L5<;895=AP>=i;~7AB0f;43v`L3rV@ zwo<3OnSyv}I21ZglD?Y**R>%-ibP1LZ$-rc(DR%r`vl5_u-@W@I&=QVl90G>4akzygBwK~sf-?5wACy17_|T3CLOF|;?b*9^HJhe{oK;h= zA5XV`|J}t)KNjY98@6%o#wEGzM}WoqP!84&{ODnBg+82vvR}RW&hx}ea5Ozp2h6FX zz2P^Gwxgl=Nhrx)9Ygj90CshV0saAjP{Jh_y-L-^#P=i$9pQc*fZD$M2q3ir36g zauzOIkh6XHlDRo--igmgmoni?v#*D`&e8?7Y}#&FDpc>@NBv zkgcD-QJIAMJPG@hiE~cfX8mNQ#>e5zW2PBjI6u|edFSes@;^HDDf@WvTigd@etc>Y z_L?sBE&K8x63{2Fgi0ou=>()A08M2R+O%lIs@0Jt`xs&QMRqV!!T1|LpLMRs{U(UN zl;vzYC2h426s|%aVV%&Unf#9NMP|8Toxb{YYDdqY_PJ(#j@pMtwN~5$vb&XjP+V7FIcI?uGUc6`>b~@8a6?^UN&yqDWRiq2v(s8zP=_M2VZ@VZ>tF$B45?Q z@a0vC_!{I`x8b_dQsFYQ@$5GPPgzX{p6cKg$jR`iSU6NF6+>Xl{BFtCD!imRK>c<6 z1erH9?*-C?N6-XecNV3oTS5E4)RBzXl+1hg4sFnH$}QRw)`tc#vQF%~+(W0d?NL6Z zt$CXB>cjhgiu=BMAiHgRF^b_0t@-)#Z|+JbgB(`zzw*wu9K zx%6prsqHV_<~pJa(oMQ566_aBPvM2*{u0|NUhJUK^OSHHU?l4{DkJbHo;MhT z^ZOQZ-YzDffI;qnGv^u)xvPR`yq_ssc2T3j=vsx1gRdI?mF67sL(ca=JLHBva8|t$ zE!@t+hR9Zlvl!8RJr%$;r!DZfCEFZ7r^m^D{0&hfMo{@aAtC_`ivwYa;&s9y6zc6` z$t-EVQ14>4{lMCb_KpCn6RP8j0|x6ov4IMSMSz6%-oif6Dw!q#M=}ev*G8{l3rttP zE(`72(-I)~^{M5D@CfkrMTgvRwV>?a(3h(BA_%mQ*YQP!0<$x~7X>l?D&nCK|H-(ycS`QE=yNu= z<^_FI57cQX4@c&deOKhbH*DH_O9a6g3V-*@i&&==yQj<@zgU=l>~y-+Y4+^Wy-FZ( z4Wl}=d}Uy#?tPDE?|(~!JS=b7?^VJ$#MjgAy@!hRrjA(Al;Ni&i_adrCc*~rgB2Nt z83@5@y+N?G5J6mg)$llYUPKc=LroapByC?bS(GEKJZ2YZfaH_C)bFCaMsFk;Jr?`LQKli7+$je9>C-r1 zx2YuucTOunm{;7NumC-B3E`ds26euQr73c`eF(XYL{Ik%rah`sG!&Z}ip|1dJ328l zwQ3w$4Cf{jVqh?W^jEG2w|cn!2t>nh655))(}voSVsw&+jE}B{yD;2(EKc`R*iy+A zZxJ1+ByFADyIHR}*xi_P8h^>;7lVHtYVHWj9;KeKdF5 zb+NZr)1t&rJ!?m!qA6wpwweK-(IALrG z&wd4t$t~zUe^g3Nmc7&|t;m9Fc#!=3KUdB)=r(@jc|{PZxd0RIlL^28_6klE0&7#( zHZKSA4?&`AE*K7o8YdDd)xd@q#t@LX#gu2CCEQYe4!1wN_N6$PRXMVK=i&05N;iz^ z3%{W}wF(!GDL~~ck1jZRq(J<%e30<9o!9*dTvi4_R-#eSbWC_;SKDeTt1eZ+0s0)!E~=XRq^$H0XtgHW!2DJ}6u8IY0N8E{)T96AARG3D~o@y)?bv!hqlI}G_ z4G3qOCM24J!av4uNs_1%h257Ev8;jo)``JHp+&F~p8r~&SzlEpv*+2SS`9Qr`RGWtHA7NkG zfTHZeYYfPmL8(2y+8n&$L~C2ePqFsKaF1vXf$XK?c2em#FHqAp2s?re%kg6e=?oHeJw&H$zj7T zOr4zz^F4wa@pT=v7z(?2G)3EV11(xdl`I6(ohWd>K)!mlB8e~yujunPGF zxEb}^j980qo1tIidi-ypm+aqn+dsiKfzjzzHyl~|WHIKs8(wl1vY;@{%-Fl2-#<3J zKRZx%X@$D$Y@Tug2?d;8r9H=r^n*_^Lx&Zq>2xhQ!KI$>thVRQY9cz~+Ci2B%pBtv zI$h^~qZg2W7ga_E)y}_*qbxd2SKM_mm?#H|VZTbfmpbeMcA1^LY%grGFEyeKi|^gP zzI`0~`EN6uLH0mdKWWe3#hVw3UO7_73}Lu%fX+Gk=;)lgq3^3eMiL6UQy52hWvWi9 zg-gGdw&nHlroQ%u3$_+l;&BD&B!eCgsl{Uq#vZ{!6s7B8NwSanp;`thkRw8BaWRR2 zI;h7#K}uZPUtdl;k}mwpf9~;&te&2tn0Jf~ezIx7z zzHRSc?KRkbhPbmO7ckT}<4Q63K?qR|zhRGyHeo(#-WLwn|1$O7i z7UuiMs{gRSb@I1mJCz$(^4?Xh?qK3qOwcMZ=p4KRKkp9Yg=n9nqg|61PP--|T5pYP zs`}s4P8~OLDF2{Jd#lhcM7zoYd2%S5Vq}1?8eUZq(ZB#Q18oj7Fgk{(JE@T1SJ(B! zS8U$0e9S7>qprW4_?(HUAFrQyVWyeAwZl}EGG z^JIuS@&JUUC!E%h!NoOsQO*RgI)wf$d-{-mkZt@Ou0R?o2{#tA;A5!kAi>5Ggv~|y zV-K=^kN(^+cIPn}d4VP0iuHfYAAdk;!d~7me#f`PiXV~#ambcqoxpRJJg|O0Qy1Bl z`{*XrhjA@tn0TQ1-25k6{6IGOQoum=@Z$a4p6ZLumlo+*oi8wmoU2R5@{;D99(&FH z$@cWIOVd+}i-)nU4}|Ia-yVNeIsD(aoyQ>XHjg#xel=CpCy2|+KV z2k(G2fiBMBU})N4?HK)wWCW`ec~O8@_Eg{f4=CcF|L5*hP(-_wTd_+SDa9XuT>Qfi z&YgN!IYK+NJ55<6W#m16oM(SXyTxT*x{AGWGrc0a>S9lZyOA5Ym2V1*nRmvcVnWv% z3XRXBPLvgpu9lZPD1DHhFYFMj*jL#Hl59-Emp>u9`nnoNEe5wp$woGdJSuE9+_SJH z_-Vm;X?~;lrcf%jwD&FFOZBff=h7&C&g0wjxq;8J1S_fTtm9|CYd^=C z7i_Q(17I^#oWU1eM`5NVvZT%ffYr>a=AAiRgAUNlC^=9fM>>OdoevJ2jIMKebs!Rf z`dWKL9nsr?3SdMrQQ3sA=$L@tt;@lYJ*7)+VWT4i6S^w}s+4Sm*;b(@*h-kE5*96p z4bk2Z;Ny~b*&S%)_WjD=8(c14G;d&*eN1A_T`!ma{Kjn;(a+`j@i(tp${)MFCuAz` zDET{C?3MhhEMb?Dt6X8_%J08CVXkG98T;cWM<%#c_wLZ+9S zd2OFRXS=sB&}RpG|DN(YbNeFiBj%y}byo>IxiR;YnDFMhO@*9x!U}#1a!?gnr+Cvm z9a3&2t+QIwgJF@gg|dDiHN zu`Q>rp4`VJ?ZH|HnzGQiRZPFSb(7m^c*==!O;@E3Smqo1N#%YEiG_AQsRtqAI_wZs(Zb$H!XMyvh_VLX_s7ftia|%4dSaX&eLu52 z1KG49LR)|;iL0TiFS6lk;ZEI$zd_lN{xXyUU4mL7$Pfh8l(igW$7?1?lsCbp{f0n(6slYF0ZmyXeYTcARnH}0ZYF52vawQ=UObL*I`j7$Yw9Jsb)wm>Vw|Wj8!o^wJ zcEe@EjYdrdv|I~{KfDojSUNH#m3KD=+fGx{ zV`8EzHhA}djsY)w_j{eT`253fKG?LdIQ6lAN9&8pV)cDJ=FeW7zeNh~k<|&)o}1Tb z*gHfVjlI6BJhfqJ!o8YGPj)Y|TWRf%hg*cUe<9XogFUn6om;fwbXFF2W>go&W8Qw41)C2hUz;bL7y&2&uqUKDYRj2x|<}_C)v!Fr1dWy zTa-U@$A+;>*S78A1YIvg%A(}@nd7&`+brdpDD1zZ-00P=bo?80<}Jt>zckgyIk)YA zQu+bI{{m@V+f(H}@)l~I5qj=DuIGBe`h%Whm!aqUpyxuYA<%R4s9GZqUud2)crjjC z@3I}dhyiZ@tFlK@BRb&-JT-Lif|odHvd;}O;sr|PbdXeJVKp?!dO(21#llcAM!roY zR=@+d1Tsutj)^flA?d*t7x&jX2`+CbzipklD|cM>s!D8GlGc~S4Yc_UXrP>};E=dr z;E~>i_@%k?7Uqu6o@Qjw0AgQT7CU6n#CgrDRpOR_I*`HUdEiwTCRj|CB^8Sv_J@Yi zZwS+KpH4d{988ZGLE^&C1`Y~r=^CU4Lu&Av7vv9hI+AK$blFA9)A*nT9)JzWoE6Xr zU>Tg$BuflS0?Sas%Zq=w>KpX^#ga*`2hs-Ge0wG>B|g1)Whza~wW7Bvh4W7y3%Uw^szgF;B^#QgX{(%n+ z(L3gI@F8E78Am%*<=w1%dQ-usS{rP^8ot`MVo2|nV_q53>d5dz=Toy;l>fQ= zjgvh$FL`-&-8R{5$5Z7m<*r~Wxrmm{Z7cE*|L}3joOShrmk#^t@>Qj$@;4PF@IB|W zxl~22WsdCX@Tp0Nxp{5Ceb7|D)3BtEX;d5Po?O(Jw#CNjgL$nh`;Y_F416_#B3yJm zAf!$3OAZoECQc#tif@&Z!fVClf3h|#bk*|owB9Rky!R`n&io`)FTO?uE@2JXosY6| z+s_^L;N1@uNhxQ?l+K*KkY@`eyNf?E5RGL?H;>8yKWA{booNQiRW(AW^dXRP2r(GP z2w&fmyT3*Eu0)?{v_%9K~1Q1E&9kZPh7 zK50_fr^v$ummC)VDtFD4=KOt7`I!RFeJ7D^9|jt8QBV_&85d;p4-{xBFEjOf_Jb5- z$wrobuIw5Yk9G0BTas62-X*}5qt{i+CwRH?et0-R){6T}4r26OIkqPMAw~&Qy(LH1 zjK%j5UC`h9g|Sw>C4}um#*L@jjJT-idEy{W$i?Yk8R2CM@1~c}Ph(XcEV?`E%=WbG zJ?r+dP0HGL?el$wZB$6vbmXw=ySlQyhOUA9hiG6?f=Q8-lQ8foLHwO5Qy%;R z!k2uSc53IGl?M*)+{h-q^`lZo{P{Gkc=xQ8`}XY;-%nNAdp^8)0kkiex^=^>&C7Gx zTIu193t-Rul+EjBZCVby260hoKhA?6BJt~FQw_fRTJwV;mY|iJ%Yuz0o4S&p(}P=7 zD3l1WpZruk=4Y__8Ld#PaF;xTt5_4>n8ha-P%_8v5o zkBhil5Rfs}%2pK_19oi)Y&i#R7QZz$?Zef9rsg%xj!HCs&b_^0D8|wkPky&k{#@T9 zg1kJ)LNvm53%5Vl{HQ9>jVq#CP-ifch0M$PD#-Q6v`zBzV#s1p9Xly&^yxVlrxf46 zU;Oallym1F7H`Qq*tPq?#rcA5r+x8k`=2i3^R{fsQq~FGpJOjyf5$=pvl!=| zFVXM0qlu0m0L_+tuEx__60*A*KXC`(rTVWxlz9f$q`>1@3OwoqX~=E^%oSlwWbX|7 z90pJZnyr9)n>%`lqZ#*^c9&VdW#;m`$|tnVE4Oc3_Q@x?=Bmo4-<6#H#=Jx9Z~r_e zEj<^ztnTqr>~SD!wQ^-YUhz*NM*T2w%t_}NJb6y0w#S+;BQq-x4YAl0CT3-!OdN2c zkd?4o_=moQK``H3nEPNBxeHUi{8Fg7Y3aTm-4AANRtD$ix{SA9<-2S9Q+aRp2f6v;r4t`)us>b* zKJ?pu$ao!`YYXmotyh$YHq?f2TV2~|F4&~@OpK%ya)`?bLYTnDu-|UjTVk|wPwDli z9?EV@7m_37d@%TN4(^%fK0`Y^27jR98N5xEu0o*P(=*zzjMMhZ#l`Q6lgeyAnD5fx z2O6K41N$-pc-GbUDOK%mLn#Cg!H|mqiP8oAWfymTIfe5VObF3Olw@m79;*Tlo-wS; zO>&y1?68NqVh%&Qg$jlO`3x1#%}O1;@XRl7U%NMF^4!JBBc)t<%tCe^Kd^n|aF#4J zot!#n%p0HFJ~3f${RYQppZ_F3Gh^-wjHv@XN{aY8?Da@fUqo`E!DJInCZTQNB!OlB zFC^${nXqZkB_RSNsOCOMXxK=YI&OH62`4|;b>hy@?vqlLKfYFeW5Jo*cNe7PPh23} z89Qru+vUfv9~!kiF5%p=^N(_cb!nTHugk`{>V=rAH}<3&s2C$xQ>WCy8aMQrX(FXv z8KmKP@v>fTzB#Sd zUce*u<~VOOzrLDU*;$z`&F(kg8XHn56d1DWkD7D$3E-!W((v@^$KkQ*+ z>>*8t>MYk(??2>&ydAL&gT?ENXjuYzfhKZmx-&x|4P9Iu2O3i`c{K$^C~=Iapi+=5 zRMMNwMbjF<#=LcMV$~OR4O)C>>fDFRK4QU(m2dveAHO?>?OM8IUqN=#v;#96zclZ= z4NJbBhcwa9@0FtWng}aiYO?**%{P@>XNiW_uwT*K_az!?s5I0duTs?!TCW~IU0RqH zkjuPT4+t5$eiSPDGqh#&{-20<$lTE#reUT0tmVY&0L3>gD z_=C0Bp{&fp1IiDr{w_{_Y2kNkLBsNArfuVt14^Uz!qIjw<-PIn@`_E@LBkOA!nQD< zLVTfyse@cq&1_YrjGRh?=99=iHMzxwLEdH`{x756if zu>lVL)7opV*cIMw=*|l_3%1?*?WggJ+Oh#72aX=V?!@LzZ+he4rrVEBy@p8e+b;+q zt!6IBN*yt7Hu0R|K$CE%h9LgCN>|GljrF33ob;F>6vWpbBqN!EY8b3-rdsuP*$E0{WptUAS9L*Ol&R0+f!Y|U0%v4 zcD+H@5|;Rv<>ak{b(^z{jqmY0aJMp8_!K;`VaBny11kvCYQzgpq(;70u*HAE??loP zphDLPgVPh}T)2Z2L97?ot;Le98}rP?QKt$vxG=t$8-wi9^s@Z%t%W%CF3wg4TmC?d zuC8g59H{H(Gt|*=FHc*Mp(fiuD7@E0MM(LCe@qau+ES={@SzMza5HG9&=p?}S>aptoUfVQ$cPJMIY zrQ)OJ8CM^6Yjk)z8)k`m3p=OrM7WYRIeoOfp>Xl>=JM~QrZblx=`>hbs$8DZg0{}A z?%W_nvscXh!K0d{*>X+Zzoecs&LfR2+}PKQ7wuZ+oZul|jT4$1z<=V5vB3t><+Ws2 zi5FbM-q$78!3Ko=9K`>VZeWxO9s6ZP7aw)WxWan4VADT#lFKHF#|C#Qw@Xd4w!pH# zHUayuqmnhBI}UaRYH`HAWFq!5+#P*3LWI&ZMRb)(da*`*j&~M_1U2 ze$XE41N_(&F<=YH1nd!dPaMlJ$xU$Mb?qk8Wpo6ik(ZYk)qt!_$@&D^_I>E-^0CT0eE z!cY-ip(qWSq7V%y7M?rOpF#__pkP(NZo%oR>S&PzB@xeQkWIh_K1rP+U4*RbG-7UP;BM^E5!3IdALER^Fb2cUhVYC>EBB1^~}}#ZOVnu+1d>)(k|s4IMck><}~|<_HS61-g`z2=+=37t}uJb z;#r=`5J8%lIC1Hs!jpU2t)DUB_~_%enY4Ob>uIY-_nttpG{H0rH5slhnULdfQ#;vJ z^(#?Iz%evcy|1ZH+1rGu0E&Ky0Q8pW?DR_I1Q0*TY9du(NQch1{4VX ze#n6MB(r;L87mN1DSsCpQT|w+%lwbD=)O&PEabknaNp_AZk~Mm9p;kRL20gR9QBcM zZr@H8|L#@R_>j-C7w!J%avCZB`TJ*-n*@+96iodQ3v6v}iTF<>Y>zP2jz>n8u&^9> zD_X;aY%@_G1w!AlFaMYR6FS55}^isZEC)5{Wj!amz|7iBI!{(Mvia`f$2VHap$pQ+Jsh6rhu^WpO zBbBh?Jsug?X7x)MH+gd%_60QY-DL&gd+HAEV&~ZA?cfjOAyyD!8Y)-O`Puwh)6TMU zC1w-lxAYf;?8U!Th?lb< z;0lAU&hNb2#%eA4|Cc zqB6#fN}W10e|W~A{QS_Am;1~bnZA4Su@6AgOOT_hJO?{MuEOg9RXH-;>6&=!jY`?o z#0@ha^qSxh!`IQp-AE7VGH}#f8hQ))eb7Y9#|Hh|d@oCac(r^LE1Nh$xs%h`G1_aw z*eR^aq3*BcDT8xfTQeqW*_`d8)u~>SQim*_vwGji>BEtqXo!ZR-H^002vY5I)d!jVsXNO`~AL4xbm^#WXy0h~?Jl{^E2Iu>E2by|OVTtlHy}zW( z_WWPImr57sUA)SVa!ArgAD8_gx#TSD{P$|@EDsUCz#iC4J!B6Z&a1(8;d`JRY;K`w zXPH};&^Izu(IH@h=x%SY9L6y0L3K&o%wo-4W?y1`#NtU~$s&}RF4?TivNsma&z~^3 zQ`tcCC+fPuC-GJA$dI7E-n&Z-`gleTyNQ2 z2CX%F4VsRaX(R4nFUU`nshceDNR9ez?wx4oTZ>ze6QZ-pVRP!0y=;r5Ivw0?6r&2~ zf?q|%{Z&IqXoyfoLKQJ09MC~jcSCB*>}CIPz{UwL)bGDyNdLLrVm(VeJ7!&6IPbj; zU87&>pKO;>%sy^C*WX;wee{VXo$K{T>p1Gz{MQB?`gKG9AqQ5c)+wO%kAS|FU<*HY z{TlE7ch)bNlzz=7bdL{tX=<;%0G|OX~^i`_*hc zXIP8S#vSXwx^P&tZcF9Cb(^P-8xWntv3)W8>F~1?%)(|o+xzzks%pkuO{$a;Ox@5f z6O6bF%^hzci|UL^ATn#QCGD&nbJIbj@t*@B=a_%RHzA9fRfk9hAB2F+z6<`{Eg`;P zLPEp%1npJ)zD|=Sb%3yE-&v<|<2tngEQbHljO07QG;uX5MJ=XgGUJGe6q%ChnhZf2?EYtH66|! zcTc#Bh>#&D5hKK;gwK3O`7AeYuwNGv7Giz)U15{yGwHG6cO7_++|L1$oZ)w+F-knU zss8Q?*x{u(18z8fg04p1aK{<)_nPa33xRt}u9b@9xd%k)7n@XCQog)IDB>eVI*P;W zO@&Lu&sy+hdLq^ljLh-`*<0;bLXBK#h0Vx)WKD#5eGDl)A&9D8kTKMUx5+Zl-MF*` zHp>4I2of@Criq~L)~MEOrb61Oge%&S*5UuM~Yjk^}MY4W&5@(iI( zlZH*v4Dw;Fa@~RK!xC1`Oj+;CF4^0}wi?%@Su2w3{mMr30q`^$_zP4M`#@UCYsHo; z8>RWsb^r0Sw3a-cdA&`R=wQ-R5t$kC{jVi15oitjn4Rggt9#Y6<0 z_fxK)_{Fu*b=BxOdEU>IXRaGFhpl%lG|#*+@s48mC>5sPRqh@cvt(y}-rk~_{RZwE z#=O49wt~+7z~*@jI%6oqp~HGIc;@_W)2?=H&W8S`kwqUW6d)7J%gqTHil$_0#Da@% zbepItk${Ad155@b$w~N^$)@^G8kxA30)!Tz;wam*I5Ccegl;uYTYgU|OZj9yXg%t> zYRrnwn-UOq-z|xF3*bZKleCvoaE@yLDNvg$S6%g8 zx$~iIC69h-Bx=>oT($9>2c2va2Rx%XXI;-YrQ*CRNT!^=F5HgO%M_SLuOd|WISbQ^AnQgzOe7TIs+p<=;mO7cjVW5S2MW`Nq z3eImZEdP3#ndhxmDndimxCQCLs6SO+xy`KE30z?kDPF39>}BZikzM(BWq-ys7?N1< z6ZAb3fMY;22CVA36&@t~u*&7?bah!Mo9Gh3c=3WYEXt9Q3u9}mjPB>VHuzXEyZ7UN zQie}os(g!fm=}=c{Zc7q_0v`_U#Wa0?C(9LU1!#6)|NfOgbO7j^XrBc&%1CR@G(!a zXEDnrVb0i@6NnFjsr|Dob6pq4_4G(NRMpd=DprmoPHzZoIvrt(TJx|l@x#}h0yJ^} zf1xea<$1_QHYn&o_;IMyzCM zthZrE!LYSUb0_yKTD*Q{wUr&%c@`(Ewf{7bm!l)Gy=JzsHIC0=x$XTojXV74>%2 zO^alviv#jwrR5b3&Ky^y+EL`DJa&b&qRyI?#gOM9Em30^Zc{Wf!KMX@If`rkF=#4+ zZU^`p$Olsuf_j%)aBaBw`zHuXzWL^x;)D2~GsXCgc<`rH_B%rTRX?qoMbf@o)r6RW+^4qk<=L{f()Ig+~C>U?Sy%jG`KMhNe4i+LC=tUV)hQNry^Kb(y@Uq(7H(~vLsY1VdqH*luA?P zH%R?#>z@mmdBOtb@z<#trD8{4@4zJcsipf4W^UQDdF7y?%K5kaQ&UHuo5xs>*gYdJ ze$uaP+2|$arQx}G^Ms8fS1e6UnIjaKpPAASVgaApf=_<1i>smf?tol3j;ily&aBoh z!_9qdxBq$3(AE<>HTWjFRrJ*kbpt*5AH-mux-ILX+xcwWoAk1^?$Nq5O1bXbx){Kt z=cTP)UHT0)nCQYY&RKJ zt>4qER{0+thYs(~K7D!c>+N#QTc}QzG>33#LJniY zyBCUDg>*qDLy#x!7zTUO}J?O<=h}BJo z9;X?h`g&XgY?h(XM7ym3D#&G?pzbSl1l>%!hz7ZPfuzC{0v#xmh_Jx&fR%{71?ojo zf-roB&^vqAj!mqpR8s!ncjd3OiV<;|ZczkmB-<~s>ODh5H4 zJ||zO1U@{i+oY=_Hlz;?c^&6Qxtn;stb1%BvN*U`^)@i}K!;{SIFoeTs7x5j$pMoI zl|{A_D}U?$q%q1*SD28N-DkqAQR%Br{p@#q{n)M1>_g?1JT|yX*AZ*y3w!LZzjL3j znf#THah9SmeaA}|H!<`vXo+gsCUTPpUYh=lAZVr27jl#r@8O7w)uY8Bk4+ATiMm>n zd`zh4b9f}8KQDGAwLwE8&B5)I-;eyLoQ*lec1SFd`FzC!YL*5aU0r&aN&SVgy+L>P zjo*=^92Kl*$Btn&${Nh9x0}7hhJ5$o%5};w%Ck|d-c03#>tDt-IkJWJ1rw2!UeW`c zop5Br8=6YwT52a(Eh}A$_*&0#hIlGm)3@PBYlmxZ42HdC4N*a}u4)&Rga&0ARg3ow zMp?;`i&fvmS_`FHvZo(U|3F>q;>alI;JB7?^=gq0j^hvkk?NaBnp-D_@eh#x1u_G- zJOIy5r!9#bgJ|L`1cP_Ru)wG!es42)4H%7v2!bI0b!W!?rbA{N%*vfqvieTloouD~ z`_fC3-0ZiQP^0I8tUOlZXgB+l>dU02%IMg%So<%xo{Z=?_IQNC72 zmK3q$gilevhIQH^i}jVy2hHf9^kpd%m8b8;&5V;q5==$ejlMUE9qX6c!)NeA1#mAp zK*d!9+Av{BJ`b}(ON4RdTd{CA-jHJRPry+CKetT6=?B|5Y4D+#a?0IbcTVh zA*8Hkt%N_y?tZL1EsI1&FiSJ`t`U)uvCE{ngrZ^y+I^ zzFfMrV{7Qicje|p9xeygPTT|`N4cV`U4;sK^5#O#(PpT7(5@9bl)g+Su?Xgd{*JunJ00Vgd^g* zg{;>N<$`jc^du`T6<%$5PkCP$WZ%x}FW+M>T)ZG@Mr@0$cN^MsJ%x_;H^c_Pa}L9-Ni4P)f4EUzNp6%^guOY zvjX*d*f3D|kg^N#G?g30ZwSXLvJ8sSb!Imu9X9=pIANkA-$3`~MBJMVO#5Wf(JMmS zH{6>%`9NDCc}3DzWJ@qS573u>_(D#K&bE{-5=UF{Q9pauhYe`u<>3?TQ`e`NPkW!& zeO&lBZoNd-24;?Xe>}q%ROi-@&?e%T(`M-+I*;B{N zWi>l=4>2!K>(#Yj@yRpmJ521;_NA9Y#ieQ8>(1)C=IGVj0Ta-)h(I6o$u;N`f73)+ zL~>KBH89-5+@jHxiDr}Xo2}w<;7uC7v2v_0+BbA(jI^Xn1?+|F$(?nCyHGntu>_2- zi!g=j z{ORb+x`_AH;O}M1fvUfUZpd(ldBOc;ZTZ|!*52^tYtc%61(H-*Bwq0g>Ct%wz|17> z$W;UR4-vi7olWwA!z&yLoFyCZ_Cv}13bm2-g+RKaM2BNTatByIY}QA*sFeS#d@7IG zeT~H}xw%)duUy02kKWAkRI(=@X`Hx!)XCe3Sv?*1*>9(3tYeWc4B5>RudI8QCGH;I z=jq3tT8jCNS|~r4t@u$v!=8$_Ky$-?_B^FY;+=t;Uv)d_s}w5{Zp ziS|azTX7lHY)IK8Q4$L+!}NkZf{{oD77VQjag#mmTcNoMJV3)X;+ekm7guwd$!=$NBM`rNPvjfDor!C|w&o1~5qJPAWM$~Lh(XW9GtG_RcB zXAOlk^Os^H-0l%rBV}h)`m}`JF_S*U$xtO?{_<%TvC-+%_;u|03qrPZ-lc@w)~jTT zYFqQdKK1W#!Pe$JaXukSSaE#uMrNwWlV4ns#gzTk@A@Of>2LK%iqoayhm>_gv=F{B zqJ{Vhu|NpVhmsZ_2Y=R=ejLD^XdW`;N1Zp~VSX3YiAasJv-jD**oUt|*gku*5N7|v zT(-s@#y(PN3tz0cc=4i=FazY_ytfe2&F##mOwr54Tg-lF04&4L2Cv15K~(i?;uUaOaz2C z@iyE=+@WmwS+O(s?}do+{o8Wb5M}TB142{rtM@MdCPET_S+YhDn!%gqIBYJ!bVi@{ zVA)I8BhF=6JD!F-Cs#t+Pqfu?>C}pGWQh;bbIj9|z4*JhcxV=zhyyI*6(@Ori7&gi zj(zS^^0yMHL;_~;ihY}uS2jWzCNzH9McP?50PA}bi<|*JPNdwsk zB`Xi507Ykon`jg+iWOSY%U0p2fGDLdrcDN#9zmmu`kP2>puZ9t38OKB)o;Nn(M2~Y z^%08dXG1iTej$cfKsT7b9}oVkF>Mvkjw0H)%@LMzfVd?^OG6$#>VmL;T>G^#<8Qw8 z(53WJ;HO8gjqy>wKG@y7JJOV#DG9o~_}maT{nSZh2_)+9fVpBz3#W3EB;oSI1FgBj#n{H3r~ zENO6%4h;h39rkhXlfJT_CqbfSAhQ<)%oQ%2;p)c$y`qcwk}05bA`mSz0O+GsEU`kn zP|&I|7>WR;hMubqXP^uc8Ysa~4yYdhgOCbQ!;ljsEHq-U3c#z@d)^&i`eK7G7Hzx! z>rba0vm2(T%JG?BF1X!h%A_On_IV1ozWpFA+y1TRdiyHi@VM;hyzHU&r~xxb%Z)uhj_;z*A99H;TJ5sU1xF*) zB@Qq8qaoK+KT|VSUR4wB(xjSmYrB=mOQ8?CQs?E z2MQRW-bOu6*m+$>O|Hs2Cn!IlORTATO}WArsErHo_eV}tExSM>japj5P=q5KIbpB! z)?POEi-otovPX)!<%=RVjy*JGa+dPt$h9>Do9hCw$E+x z>YSNXCeGqKiv!PG!Lv}<{~0naQ*a|2}HbgT!Y*g+VN1k zqsy;BatfoN9GuuqTylLP?Y&z4zXGlimVI4N{dNon)wqN|9dF*bor}6z{cOM6m$blkfkW+1Z^z?tS0y z`+fKR+}+tMGv_?#>9tVuck{{^?OQaf3w3`Bou8W33BZsbDNhL>)SssURoIYM9^RHz zt#a4cg)h`?I7toT(kj=iQ+vqL*@J6WE{e-atT}r0$|)0*s}@Oj2DY4&Bkwu7X3pDT zJW6ifuSLf0kUgiit=%5V&eA^W04M&yK9VihR9h{rZ%b4%=2f^)mP}nSV9p;c%a9~M zDtrLC76b$YM8g+?utx!Uf64}xA41d9eW@z4aAVs&1rC5K_@JaOpgMtwa?aepq?^Z< zP(gha_m}8wAtLh;C2FNeQMVHlD^k4hplPE?$MG`b)5)Ywb zJZ-oZ$Iw1Q5ky;hH21=)HP35Sn>C*iX z3uW#nwX$W_vW-|~Utr6uZ6C4BLn`lBCB0O`2Y+24HLXedO%`D41(*iH3tIv6H$6m8 zXd)#Pq2rZ&>CRYy%TMkvMyi2eplYd}9%3`lyI>ST-wJV0Hl|FrP{SoOCe%Zgr#*`l zAo3}TFgnatIV3#Q7G5_gv>uzEk)54U+^Ai;*K)Ba*xmFpzHdhn= zXk0|=f6;T(1xAUmrLNcNHC!sIEW(yAp5X=#jVu#r42I|>cC5yTf21a8{}z)t3~5qC zN;L^62JTQ#9|T1(`e%`-n_JkXoIbsA`SeYzrcD_(^F?K%{L4`TYo*j;Pd3!g-@RtS z)Vz--jekLg<9UIUiO7Qm8bm8@11wc55sq9sk&HKk>k5;jbhfX-djsPZB^ zGYaicgdjF%?jWE@OdDx{2AQlzX#WB^pvGEfsPAzECn&BO4>dtal>4AM6FrD^R;p~# zVWSle?Dn31eg7fpG%r7DU~=7Bte+Dk>XMmSHR-Z#pI$EJOLb5XEFgCX7L_1}SF1sq z91aR7sO*G=N!2$Q0RokDKb($ADvK0#eE$o3z-J8Dqn6kH1#rfgcm|xIEPXNk&J7L2 zbXXCiaf3qsnxx6RT^r{w89GKQt3{-ylZ{`RGdZnsgDxaT){URMLK;0~oCXU7YUY;) zYLWyb23RadtRIys$kX;DkCDi>CdJ9-goR1a>N<(`12VlluwFENO|u3vgp#BwJfw*I z%tKg8NGCa?q;u(c>0gfIbmV;Pi4@9RSe?O7DhuOr$c!L5(2~eol)V}phRs+Q+OfVBagHmNkw<49inh+*64ThFr<^TumDYq#_IRKO_ zY=JA@FITw%KV7aDX4 zj^UsTA)^6X;9Z(-+@_+dI|7MG^-z;5LmNp52@g&Jm;qy0wqdMn;Rl(GFDn_{^Pvg`>i=I-deiMd*Z&dK7+;r`g<;qn7Pn#>*feYr1i$h&qhk$Sif?-y>m(V znUqsVu>Zx*lpNSfNr+9>vm8^)r`0DcM(jAAWDA`DUiBWeCXw~uXE3>Z>~^hRWr8+? zDIvK4>;=IQBa;r%eo|h0i`IS_L+)c!x=eyu@K+9i21wbDbx5ok2kyZ?-~_brAK*kR zfx@;-Oq2=MVPR;+BtVYhquVQ&Txo2E@Ne2V++;pHa?xhH)WN=W?xYPNj^dEbjGijkt=Q%SvP68sHV%9u4){G>^{XZFHlh9Ny}^Zl zSm$x3>X#S#zo@dsSO*R*+$i0^d(i)-20_KuJ%`Agk}sX49tv%l^6r3|X(InlBY5eJ zY4=u%47}BEPnq(zM&e8MyuEy2>uyq!PUKS3wr6?HRJ^WTour+A>)O#<>C4`?JE>d9 zq3&h#Y~w)J)xjMz&?C{WQDed^>>U0oyw-ElvuVpF{Zdz(1wD%pB&n4DbN_0s$|74T zr9`c-eF8Mn2^vBc2uP63dLcA4MhF6ybs6C#QtQZR%g|oGal@o-4J$kk8bGaj&CIP* zi;O3633_+oFi!180cn~sx?p)O@ap-{H{19GJ!D;0ie&dp}1b2EiIh5D^SR(IZ!QD#h)w_C}y#VWNblW=5Jp6gs06{dCC%kvX^ zIV?*0jF;n`&y-&V%|}>zsh%P`OoNw6pE2cj3LlET02kq-y__*N1d;m@ zOCgyeina7LK?0E!l5;CmZ5T2glCoKhI zki)c}z)5e=+MvXt*2cLp&D9QC6&d4*@QAG$RP&pZgme1zTkGcT+BkRVey_ee>P0#x zl3t!p6~Fw+hO~{lS5KU>LTWN?gE#B50;TV00Mam_A;0YglE8@4mz-ci zK1kV5@KX50 zb?PY@d%kz=rMUOx;m3yDuRP_|F0*DIni6tjFMFWviI2`0R5<*t&)MXjGiUbfGJOik zg|bVCKYWb(pD;^P)nYgc!L3a7KO_|3T{TDmppr3FiTtX>B*+>7uLaPZslgA`Hyd^g zPpEhNoxPc8fmpX|Kjpx_)1fQ8@06Z6{H|zxNNceyhCO>5JT(9vY>;OQR^;k?YtqO~ zS(Lg2S1pn#IYLpNVdfyEe3MNAuN?)~D2gjr9`W(PW31@%XDx~fhR?ooK|14T{^wTq z@6z9J=7^0bPlRlWM5SJs)(GD!%@tF21*798ACq?@f84XAl zMLbNTjDl@FSM2}_2KpjxiS!9La1q+Tx{=dBt`tN9ks|lxdVwWHWPY->p;WA)rn+RV4%{5%5%3AFPd+$p)0x=S0TJF3A6!tH|MN2-FLGa|Dwn!@Zt zd8Cul56m^{(Ryb52M^F~Z6e?5Q8aAUhy|WS|31;Q=&+-mHt2BD(u3{#u<_DYj?@X` z=MBSb)7d|7lEa@}l)u$R9U_jASN0#OP{r%nam&KWLvbT z9>MB0Mq$Ft$6MuKn!tSNeKuogCy%v3{7peGRnTAKBjBnx_^8d0nEX0N2Vp^*hu0goi?3tWZ((^@)NST&R{1 zlKOBti8t9IGV&F1gGb9^8BdF-U)HW6jekF=uL1)e_ z)=dCaUeiK)|w92_>Iki!@#*Mo*()P|LcV5<~@3L{*S$z!zPkCB; zdRqPZ^@;8IRiynlYa)Dy>tvjZ)l(;DPKEb1m@ zt&bSaPS5!^t=put>0K3sU8OrsR7d$@p1sln?-jEK| z$jGQsvvFhTFk9yM;nTXA%lh_NCe3^G13nzhGr~)2)~~Of9-STf{q#|2UIEdU=l>Ob z=_Dm!pgZ3|Ut%`6O?!JWeTh6l>D;eh@~v#-ji=n>D`^z1SS-|Whpj8UCZCfqnb9KA zx~#*ou5fq>SE`{}c0PoO9=|umqD^{~5SBW9x%?@iVS=LkwKq#B_0v_ExI&N`>4!)C zl_<)44)PDhp9(9u$*2HzV$tqPAfEeZVsSQNTfxEPA9a$ITs1FhSQDbDuCr3B&($~j z%dcPdY1Az<6Lb~#d1@A&OY_{8A85Pg6WOxTtwy>k`xcotU%+ zL1g;g1znNYh6-ae#=LF9BW=~*B+&v$^$>3)v3((|WTGc*iMS#IeZ`KHeE7D{u>t4N z4IInc^1tP3QaG*K@dKTnqkq1}55myHp&8a4U`bbj?SdaTbHhyPqgXl-K126sz}%$M zuy8!yHJgJfcuIoSe8`Ij-mcJ&)$ZCWwiaLXAsgO|m6Z17ze#@UmFzw%l@QWtTggn? zW-UODR(VT*iz&^{rTeoQ6zD4V{8+I;U zw9{HJbG)8YE7sLOS|)ABx)LzQP>M6I?bfMcxqZs=3jGILXDl4iYq|$tEv-#UsouJwZN}0mBPV;aCV(rgzdqIDY#{S#xVK@Yp5*EkQ0%68)50K2}dCU_2U%WOuuk13W}Ftu(U$* zsJKrSQxAlNY!`D5{oH@RS~U{@nio!1^k}mwdUxjuuIzHF$dp zq!Zhv@l5?+RRI;CG{>sZt8~E%n-}uI)%L3;nEI zA_8QGU7*D%BpxNDqBku@NCl=m%gbZ+^YWyr>@3gJ@?LtB^=7YH9-_ZkwCdqW6`>Xk z?Qn|9EF~ABQo9!hVkRNjm4f*Ag`usa!kjl-jhx-1ZTBPEx{*_*{0ZATQRGzFEp4Rg zV$Gr6sM>^5zs z0$Tb?O|Una#wIVU;9&YeRD}gyRllf$iz>RqAPyH)WF~}I5-yVH0=BXtp}`YQjzIlVoMjPoPX9LaOku0EBO5n)=+|Et@iEG3v@qK5Zl9tZ->?yM zeDZ$h5o%{BU{l#L;suBpgXPEQyR3|h%Cr{*G-D0RP855ApbLUt`HxKj$HPjHtwUSZ zWMIYrvQ6iy62o)v)4WILIcvwx#~3%L9k?34gTp7L63qpoToTSStsf4Z zElpol)}xzTTwT_>#f(`OE;JexaRNPYj%@GwRky41ep7qws7O1z^Q;f{KIY&l<+0S~06SX+>GECk)@FSI?qv(@psZYHjV?>H)^gZ;(E~=ggqj zpy!l1XqxFRGZk%c3BJ%u!@{%}klswzIldS<#3{C%tCIoZc1j*lN+R`%?Xg2D>xTFGv20M3VMBgj*W^0wk>-Hq?SyXiZu>x4C?>=x_> z@f4KLvBBiCc zwp&PyjPL;gnfINQdI%h1n?h`0tBXObPVJz#oxcv+d_1pm71R@q3LO;03}T+t4=AUC;iwB2RSsG+%|#Xmy-827iN7$q1k;is-r zQcwlAqztSAOkS*O_-mtp!VE9h9Sa%-6bvsZz$URiLU_?p5kdlG{B?Xx!U}XhO zN(x#86!a-6=uuM8rKF%uNny6(pLZ)M=v7kC4-B%Tpmjh&drE64eA)0gWbsZiTuu%s z0I;S76f7tym>y67kj)AxSW;3jJD^~BNx|HJf;`AjN@}K9f+j+O1BKgDWE90YCv%D9 z4RpY#7Ct0>Qou@aiD0SlAwm=}beoF{O+bk$W@q&xp(hR=wt6YoVC3N$bh zWB4z@@L6u~+JHfGq*+4-&XJnE+izUQI(19<%Iqdt+1X9ATFb>fhQ88eWX~a0>ODC> z_Pn+7rO|(nWU1$^KeKwHOMA>3-0vC-b985+jvg#T@^XKEx96nvjGm>B#)|*hF^`n~ z$3E*fbxN;^y=P46#g9k{t=n~s_H9vP6KmDHef#EP=!NC*h3$L3+@X8D>ZMm$!>eP* zUgZ~TQLN&Gy?ZC{Z}*lS-`n98Mb4fe{`aK5c7OSNZk0;>)6!W_OGBT`(%!(&td<^* z&+T7$j0dlbv_vCzSlRN*k-)$J)I}(Pk$Cl@N(rPQQC&nN1*R>OIhK%2lc%c{Ag@j{ zL}CI8Bvh0oqm8|0B_^v;s8j)lMvwOU~Zq;__nv`CxLH(ZHldoRA+D1_%MX|k7TD!Ei{L!QI^oXQI*>g55 zo1IcOt8VX%CNNg^Ioc{-TNUWW1LbAPe%R?g*wGA4LlO>q-8dKBH|YXSd5r?$)WB!- z996B^ZMJ^c0Q<)*C~)v12gke*@P2I5R*?0o}fN>d$f7|wKv z!7|WyFFfPoLYR@zaG(o@Q8u;e6+n?7)!$dV1$m1GR$!m7u27g8?%o;&fFs!+gK`J-3*PuSrq^0I9X7g#CGW%q7 zCfO@lUQ@rxehmzvqv{mQIQ(RSQ;8E zq5k$2K7)^+%a$>vh}A}X@7-KStH0#KqGrA+HnCrh#;J5xJq+<{;qBFDC+T-B3^h31 zFdjD~RCs%3KY?XnvmS=OgVlRur>LoC&XFxtKS*P|{iPUbzhf_}J~At#P0KBBGmkfh zcPwBlN3imPn%8dBw!yfyvqudXp7T2Pj_NV?P!6@&kOwKCE1XvP!UU+HFsq7{=mW0y zLfNnciJp%}H>n9J?BSN1tbdTywZR-z@u7!!*&ost?AsSnfL4Zn=6X$luu1gC=y7TC z)(05w4=HDW$n#Pni5z62CRN&!pSNr?+q5h%U)r*CfwFAA!kWKz=)m?BI}RP#Vn1{A z$ot2zrcPx~%@VfU14ttSK2fsJ+42`ZNc)koa0olBUBp$3! zP`My-xQ#4UNR)U=ztr{oFzN2V{fDl9SA6jvzs^6a635nlku$H-{Gmf;&tN}~`l8_I z1O81WKg-Wp^X+U(PFBtI`z51`rX<*Z^ZC9vqz1bQ)xoaUZX~z8Y6e>yeKhoO}`Dt zj%@6|Iw^5s=e36qJGyipHKI%R0fVK1?FaOIIk#VbL6e{x^a;!ZUZ$(ePRC(DPkqZe zdV=arnKu?aWewpSh=2Kv<9o!W94#<)HU8Oc`SC`Lw~PZ!-%-{8rqP&qVi%pckseSG z27yP&A;?mHmLOPRQJZW>XQN{({j+)ywVIM8K(Z#+C|X0=Y<7`&?yN~k4Y0(>(9t0b zs2onVRJwf6ukQNxhpyZ`_5P16i)EDL&Wm31$*k$hn$7ab!UmaN94h$w*=KE7Cd+o* zY?oDe>COc=7Ydlo!G10PW)+cfTi(zsSAa?1hbs&U&Tgn0M`HoO^*7UJ-`1)U)66;zcEvn zk008!iquTXev99&^~q87lfn(%JI@_EYJ5FA{p8jhTlz(q>#?WyA1YCu-@# zf@0!WpJ|g`8!@Ke?4o}idH2@9?w|i~_PrmA=8YILoBupk+SI>ehd$lgEkAmAbIy{4 ztdHL)KC(Wif4}bMNH(^|SzN{5spFq9r&I7seeW*$Wef{Ie#zPxXeya>`%K6#Lnc6& zNRx2NFM|Nn@W{?$Fehgl+dsJHgkDn@6#sGV_>KOX_(^HjJhr9RvL>$#9W#8_hsEn& zKJ+I4f!2xerL;v^1%A=wzw--yovLCH6=o#P+zV4BnZ6Yw%?gnwZ7Jr**iYrpS9*k?xP7s2kgHk&gmX##?#V5 zLr$T?=!?>*OIIZl&-6fNAh%|wKhv}T7nMFYB%7s3A*_B0f2D|bDUq_JW)3etl)WYWME6g` z{cGd?-k2Zp&-)7vLVuWkfAKT%WFkfFVX93G=0-^jMXJ%1fU-CMcrXA8|5M_SRGCHH zMl^imZT>mGd7G{0EDm0T zX>?HQI8UJ%Lkb1l`T#8@*pp`9;A4yUc=>brajB0}FTl(&(D@zEd4k0`lSHUi`hE38 zLRE^S7%7w}@)kptG8Cj1Kv6VMIa$%sWJ{Z~XW`k1cMV~5)+wNky2ziUKFb;dm*b}L zTbJYW=CZ1}U9zk7JF-%}yt&`-uDMORc)R4V*5V-_fIVPqT|7z6PGNU^(#d!mAvA8 z54!S7UJ{%t1K>Z!n!A?OQ(nax1Vi7=Q9ZOAA`i_OK`S%KAAw&)NU~O34uNBoL{QTW zy_c~*n5*G-3RBahkRYfomcS&T)sh-U%T+p!8FX_7e^Rf-1ODCY@7MpxLQfpny!L={ zD1Y-lDSr3wEw+!o2X;V6OG2^3tkN;p+2o z!rVlLx*n@~Ycp59O<*RGVFtP6Go+zcecDv({KRqsQF1v=Md;;Kd&W;BDaAj2$kEGPiw zrhsLD1)vPKYX*W2%5MDU@4rLK;qdQ%V8POf1Dn<#F4(YnuN2Rp@sC*@W^c?SR+pEQ zSucKa<3iJOUjTxl-;~k?@bk1Z*N{|jCml&m3`Ljf0+;nAtCE%2ylNM3B-06MDezY) zT~0c7pz^2ZNqI!+T5y&%@<@P2d!}_Vo=JVXn4xc%iI)lb(AS~!GVy2~3&n+ta*)0& z)}g&=6a(*=L>{7GFxOzbvuSJ*Tkz;)Fdw&=j}JbHMU9nLJ{!+omqJUs$!|Fx^3hnA zbB*wF<-s3P<$n;bkxDgDj;%M7T9uX+ZPMi%UfT}q z@JEHX)sQD=g1Ii4$Q@^%^Moh59m0ZirPc3zR`~u`#bd|y7zH?9*mB{-&R&B?_Qtc2 zj=^5Wvt&y}ZO^8&)X_-je<|$c;$r+%hq=H-Z{2HPk~1cX(Qo1gDX}F_3(5Bx$Q+1J zcX*n6gNnzII1;_~lrBY%oj}eWMeH~32WUAYS*!uNr;-Y~t%zBpUIyFF^mG^USM(C? zNGifNTag|u94lre)W{$)t+Tu_-jhJ?N=uTUXL47Py)VdFw4YZ}oBpujKm4A=ynnm= zTZNN}e{9=bwEg(Ypz)8_cj&;XmUhE1yQFuIefi;~j;FrJ{?956-{egIs3&4NZs6#2 z~N4DiWH`A*A;}H>ZAp?F3r}My)tClpAX6YVpsIxC#l9}=(DxU+Mf=>{0r&3* zzrU8mI}^6@L*PX;vLyvvMZUTYSC=M?asomF$ZtP)V3E=`p#2*|-yZOEQzHVr8eLoH z%z|wb+{44{G3Z#8f~EpVaBn3gLVD^u4G)izEAlbST3=erO6Pm!crvzgyJEX`?8Mcg zA$@udQ53e8J&wILIzK=BPK(&7)35w|{lu8bE0<0eIPMF5ZZ&Wu98>bN?)ci4O#TZO zW3~7Qm%RrQzIr5DYA$^%1-eA{O=t@uY$Y!ID4Bzf7Y<_Nc4$t0cm~2~SJ1E#M6!p% z{A1m5cmL`Ep7gY^-5DP-iPs z-Ll*UCq?;t-j+eCBJ%LTu!y+us{5==d|Hn$f3xHa(xUhKEy=@h@R*cFeccrg&=mH;FHOEvEgG&1A@C zbIGU}<)vZ=lCg@N_{l7p*#Bib!^hHGwHapUnluPqE}4)6(Hkh{hP?3tY7xws@H;RH z)-q`{KQ8Skoy=b5hviotD_ORb&UpUGRyr?w= z&J6oej$=QeG$F*$i(G(EXY0aopkJ66z8(ZngGFC5Q3i@Mc=NCvYOKSMCe`9UuL1P4Fqfr44jkq!js*NsDr0G^F5u)e6 z_b~NAIO`{8y`NxD*XF<7O5WNjkZMH{UGtknX@NiuHQw9?iQ9_ z=|3!v-~J<#U)#I^dq_kbZFRuB9Qwb98S3jyyw&ahhxO@7uY-1AVB(ZAXvLULiI^kh z{(}J;Y7GhB4g3&?0Q!XzBSa|NAE{1fF3yB4<(uUteC>wKpMCS)y}a2o=WJPD1P8@N z{zdJQ^QTU27&&F$)H;q2HJpKNSPN%R3G+o|(M?D@1EH(yXQ0!d>hCRdLlgrVj7l|3 zd^-cFw-M_0FdDELHYN-uHMPRf7E^p4YqF_f0vbYJY9*OM$Jmk39G{!Ni6*9KKmxlu zO{o=9`td#fX!^hNum2TX6qGk><6Aa%nm1A2e0@<~2%GxOhnT!6_uBbn@u%<1opA1O zzWV;?dE^gBLZ;U0K3VhQo7IY^vIywsg07GTE8WJSH zf;hjyv?bHqp#5Qga2=4==_jF|2C^Fv{0PL}62xpu*uA!A|2oI3@m~Jk?KVtrsMPH9 zvR8=g$Kuc4b2Mb3FKo-u4X8g4xKD$V2S;RN7fiPgb z0)*oR5UH}auy&Ao1|!FqNe?tPoVz$^&A~*+jAl*3#S|#7a~xuUAO7pX1zt_|=I7{i z`Ca)he((IQotGtAtT{@WRRGOkfHX#y7F223((WhQR~D5P7c*8yQ>um6R5Ctgv%(;1IfeqKXg$jq*QND_6aKd zF7z)Rz%TsB7V@q4SoN;OU0L;eD1l!5Bm0wk(SOp*QU;fqgZ^`T;Mk3QwuH~+Gsug| zkQecyL!q`$6YjcdFra)IgJd=@YGy= z(eEQM4;Nevtz8Tm2iTS7D>MWz^(eAC{h1Q;>d78UXO4QU_?LG-{m-bulg9GTyYFo@ zwa7Ye>f+VBY|G|{a&E_-U2;|&+q1rNUX}RO-M1dCUbE|#&VBlHIcv?g5#PYVmY3> z3_23&7e1Ja?PbuBO@4Qi!fbl3P8LpI+YI0q__&Q^v~3JEnK6{es9wxj7EkD+V+lJn ztf*)JTX2`BvY#FjR>0~be7N8^g!MtTD)j`N=BSt-i%n_xV1kS8qZZihc6FMN<2i*M zpdoscC8w}V3s&kCK{opCEO<$&(ks_jv!ovLxqKi0&bmvsZ~aDsRYhkNi&_V7tSQj) zlFAHmC6iouv7XO7=v<7`;IWW!kc-`Bx1;9=r848{j~XoGbKWZ> z4XM@?>GRU&tzY+M9&4<%8_L@VZ@|YW=I3o`;i|L#Kk|MTyEiak!O1|&2`RFhI+$xJeNuSFKs; z(o{~QHA5taX~Gx{!ju~i&hx6gfbxsyzdwY(Ov)wyiH(9Jh7!ZGyX@fal0pe-jG76= z0Ih?u=0y8q(3jobUkSsz78@kJg5p%KI6JS=Uc8-pg-Jl`dr>_^f)!afSiG^@IV>Er z-X#`~W3J;|c@kFcK?+0>X%akF(;>vF!IQGj^98yJ!7z{gSEYimYi6448dKVvNa`h* zjimxr)tY3LXE0^yYJT_a@F^ed<2lBYj2cfeYUuM=qhFcqWFNO5K=l{@9Lz&AUZ6rI zk}Dh~F0j}vl=Uizi76p@i}K#G^Cs++bw~cJyr81szpg(()7mNDtosNwJ$2sbcZ%{4 zpPMlEolp7Q#}juvS@hvM1pBgIZK2p7#W?d+MT>D7Y#I}3n-o0#AWX~{M6c=jzT}ki z9pfvFRk!=nuIV!d7rD0vrQ&&O&Kw~XUb!Tv45{~mu%0axUb#E`C!d=|MK}Fe$gLLz z_acAe&^#ShqGv5s<<1J24@Z5<|DF}Z|Ho)}m5 zAL*z<-_vzemv$5G6(NWwoU{zIQaIWtd`viU*2LRbqjv_C%%Yzmv~hz90!ByqcK#S~ z3WX1S7=lQ96-pA+*MBInN`IEP@$G5+{0kIWWDI2RFxK%!x-4L^405?WU=e_su0RDm z&O&81v^5j8nA~ML`iP&oHtp;AKS{^neN`fkM<~k2*q7f<;hDxGNT$C~HZB`u_2L!!BAw8fLKOtZI2Cv&vh~U5@$wI}epLPx^@| zyzEhZeoGAk@3}tpHCCzqfgSvusJldbPUQO~+B*Ps?e;yEm-yGvhG0ywp0%JZ0-qB> zlVb%dqcy?~yA<_15BivNpO0jtk?#`&o!?1@$pTbzCr! zg^jFd^wr+8XTtM2eLR~9LUbqgiFI3l!@B*ccd1#=G_m;q3)RvTtEP-z6#rW&^T()c zYW^rvHeWhK`aj-;*LH8)`hlgqy-%e;zm001avZ zrh;4I2Jk8bgY;wK0!4`oX7)fCNAC-80&0^Bv!MUbb?;u0iv|x_H+UcngBb6N=e({I zqfgbA=~KLa{lz;L27+c&lWiM_KC}Nj|4$b*LQ)aSQY@m%0!g?AR}}KewI-4VH{H^r zH#TY}O8zF82fT4@-94A$_y~HGRQ4IFnTRgg$g=&2;k>5szYa|RzXQq>_8Y8AV zqq0ps9fNqAL0c$5BsoUpVuNQI)A-=dH?+zmy0kbW`r$O@$PySDBZB)>DN9NHXm^k( zzh1^a+3Yu%u`T`hb@LpRc>=`f zdxV`B6m!x*j0qsf>^EfngPdIIEtn4N0;&8MBoGYCncB8XE&pOwr1?Lu`J4YLzjF4( znpF*&oLTbv5u0N$YE<~Whl@8pUcy2do68E%wpv{!`PnZQ->k6x0Pv+{*)Q-t<>9Qx zsO3fXO6`nH_M|{;!WXlPS9iQvy@hs#+OI(Eli5#Q0MTsNjT&jC8U}0%G#3tC-dU#L zb}*q3G*vp{cvr43@x6r~mwwT8f5x;T>yq({S1(;S2edeeZwk1u?Cn!EYIfV&b-<8e zy@w$mT-4+^bLm3hsh?!Xrt=dS2D&|H5`DVrZVEn>6Ztwb3d)h>D@T&A+?aAC`RHw| z>EvJ@nqx>pRflL0N;=F#YW5yX$d{O?m~-#AvSyE`W0Kdwyw~@8NJ~AD$@qK#okzZV zwBU?9`P_jc?+V^SwHTCNl4McUij}Jfeoizcx=rZ#=3?2lidx|$=3v<{I}I;A)f{}H zU^q+8@}%;IOqRni2HJu^M4@CzMxl-=hD)?VG{%MjQGd!-p*j?ss7#b7d4s|t7@icv zM2rM^O!00NhfX{+2Hku@V*m{;X@zQh|CzUf?7Q`Rl+0H05nl0H?n-9Jwq5dDTO~vC zinM2H&w#1JTIS~mZJQdsOL%ML!z0~Z%Bnnqd)y4WYdNXo5KG1 zsL!I%u2ah_(JY@2V4DH6N0I9)-MT(?wJJqV86DGJ-Wy^jw zN}Gd&**!o6yg~rsRnIw1LPR)8hfxA967&m`6&UMG+7diHT8|)p}IEiYJk6NSv zjKwTu?sPWTT!kTqOIU^#+?Q%hQZ#89iP7Yyrd-L?7<68Ktv|CS1!17Cg`v3f+SI zsw^N(rxN+&m70K8MN7J6jasE)23Ar~#cd1M!Cvd=AQ6F15}%QENV~!` zvqFofySN`gPDA`00zmvo2mrKjp+t0~uSF#nMjQT39aA2gS|hp+-MB_F8vPVB5a=Ri zPNvjpEFpW%5A`ZFB`OF+s#F@lMK#_v@g>c#Br%9?CL#6|rG{frRK(;7)jBk-Qrvpd z`u6=dk8Dt(+)DXhthBteDk>tPPMf-eho7uBXmyVsEBn{2xt8TuXj!FEYrpu64StpQ*h#e|}AWOm!xml=Mv_7tS zKv?i39ca3}p@#Vg(Gm6!!yJXsFw8|cG>peAPk-+y?_}>xZ>8ta)7~F>1EmZ$AXF!) z_mI7)9yh0!qiP2Ble4LS9zqL^ai(d<#Yj6jFFu3+v5zkN`0Xivhe@0xFg$Pm82;nY zqet_*=1aNP_w2f+bbU0X-vCOIm5{?|k&j@Xlws6QWm<+27@t0a(ps*zw!s=gWokq zeeWBn?@dHUHn)Z$lD= zeM%K?hHon-619SZIg1Je(t&l6P{#xXy)^`U+d#^sIOf?gyH#e325q+Nn6YGYi>B-L zEuO!7YfiHktv7dJ*BaHTk)Bee-}I?N(z=(cvU1qWS;NtPHDxR`N>oEzq<2skO*M$l zPIJQW)_3SK_zY!-?sXC_;eg-<@$e>_)>M5642hxY!<0a~lskO*7QV#BroPGN-wkBd z=I-4)NV35?iHXF~1J2z6=eMzr3YGyHoP`youR=GS@vuV0P0^~|R}>ARnA6Z}$RwtV#BqmD?9iecQIl>$N7W+Gn?J z$mX%t^Y>L;GIhr5vj+BW^HSq>z*xYrGuFNzgLZ>KpD$~x7iy}$dR=WG<&?SCf?m<$ z=xyc(lpr-jV^^R6nnxH`O3fA0Na@z<4(cXKl>_~+$8Oe>HL%EYvuwTvLy%b*an&j7E*Dhc7Nf)(eJNE zjn#OY=)oDEeEe?w!}zjzx#w~J_^9|~d{E2c;k~9SX`HbUu`0!rHx3gE;_*fqe1^8f z1(=Nz!__X!&r}wIwlhLqkHp^|lOOk1RJRXTNm%SbHr5VyP6dBN2Z&k9SQMPgT z6h)S1l5m^1A;_TKi&I7=G6$VUM_XoF zJn+K+n5X67=Zql5CfMDK1Ilq>Irk-2m12*xYt0A*Uo?(AVukPB9yfPDtC#xsZP98# zrCtp7cKhsYTdF&ujX-eYR4zmsf)cspOX(k{&-tn)o|A2*wZ;7DX8A) zJK#-y2k>GRGp2k}LQaD?B>)Q7Hxy5Vi(hs8EDbNcEmv}El0qauzGMSs^{X0ODK)&NBZT@WCpw!V6&ic5dV~oN8_M!sL1<2-BvQkF z0zJcHkS(WiD`00*ob1vxL3~Q!hIBUi+?1Twb*G)U{9)eX4Ih{F>R5mLp-1oJwq&Cn z8TB*P&RhM#kP#0jEFU^}>C#V@%5QfZTCU&jUZGX9awWEIWyd%BY?{_#Y1QQH8Ltex z;JxK)$g{u8_e{&~I<9SY6G__DVfwT#L9b4k(hY!>ECb4ZLXAs%XzY=CC4rE4I#dO( z)-POakSsx$KgZlN7F22oV^YGA!6t{EEycu2spQa%4#w!I;5adbFBt9=D3bEr5&X9^ z5576iJV(S93>#bEn7De;r>!Da4_~e{#1 zM@)gpQOJUq4`N7$l}mYMVQ}uYZp^agNp-&YejgN-DFUdFfBm{CB!>TE+CQN zAW9v>5X2Jmn~2p2g)bl`hK)Nb`ThFrm#?i-lZy@I<+IU)yTMyq_(!}*n&4P&J^ab_ z@A^0APdDc^il}#B*_4%AX3R&S9)nNSVy$SUKG@Fs6+veD!UgNpFHEPQyH1SBB1ik% z#v@PUXo{^F-qba)%8kzS7w3#fafN5jtY?mgj?bh{KS?VbjrK;#H1j;pkJr+d7V1!p=37+I;KS#BWy-5^o9_ctf0{6En@K( zm)hy6m3e!bS)Z5qmZUUBSx`Alj4Zcs{5|SDc6T?s`L5$4d;Jm%=RZ)|8#}}tL=W4P z6>Pn&A)-S*c)GLsG;ZPS$W@P38{SYZ>S$}&q5tT`bK4!HHNU3ZmG0S=T6_^r=p#b8 znx5oK^EZ<1nzm%?NjWE822YpE1B4Io4hAL@9{DF{`TP4v`6v5l`seuf_8;wU?+GOs z6=3Bcu_CY%ldYJL5*{br+p}o#p8TBFEpzzpH^vOK7W5uBu6J6a%+y;K2}er%D>uq~ zZOefzl!e>MLh6n`G#zqkvE<{_)MX`;dmi;?QE2i~D7n2%gw}RZnHF=i!ef*^2>*d- zE2niQbe({xFr-Uv&|W>^f0;?M*SzSJ8VC8ec=+T)T^Q%d`r zS2uJ0TYSRPZPupRaHVS6+wZf3KK~SzVPc&|xWPho!p$fg0ljh*R0r8Y?}plq)yYwE zvYaXB$kv|Z0Q&E+j7v%p>lF}m!;;%3pV-gunOAEa_YMF3d0T$L5fV9?`*+ZLprX+^88Qvx(k>A($ zIz%}NxOM=|*wJGadFX{U!)gUVV+kN+EntBq`~wmE-H6az9xdAu0%vsM1n8&ZJ~_g+ z3Ml7Y@iNK`8r2LBE_R*tM>fyA-|j-LQ6&JesI43;DqmFcNKYXqi!$m8h~<&*4_ z>7yW1%s{6acMxZyJM`2SM*Fzi%jU9C^z`ZVAU4BHvYU_90!76K1F5vx|a*h9D+XvbSqKT zvA8Dy?ey^GcmvSLv-e2Oit+b|@<{f`^vLn(?J?S8w#Q13Z61d`PJ4Xhao6LaN0~=} ziSkr0KgvEJ%|!%cjO2!Sx*Au~X>Pd2jcl1tnB1EabmLP}9x($#xvzAwt%J|Wi+m$a zx+_3|r1c-*0l7&ydDPvi3hH#p(Su85gcBi(>UoVyk84BDQygp7&I@xo;Lwgs(;VG)xy8N<7xuD%cTce<4fCvX7G`HK-}Xp)>_Z3fj0p@ne6CGx7YF#^EBgp@R)ftlI3b7M8; zo$J%2-l)nI>$U5XRdq&UR9)r4)~%1fYuu}4&5FU9{aVzB6#VoQ_~{ayOgYO$H{EEo z?Cqvy&^L}nkUjZsj8RfZsUX7w5g!Go!;ghF1pixDR9JFYW>`*G@37Hfv%@^lP1DV? zaXPdGE%ucpJZ+@3Q%sCRQB?A)v7x#wimkmuNP}6~L;X{{G-*^PaR3B^=3iT2Jr7Bg zf(}MhqNSnvi`{JSota9r5l0XK8|iuxwGL=%Jrf?2z<2n*1SNw(?k zbTv>BdB)`AH+TQ8lC3Q6z3UfQmF*9{Vln)W`==l9 zM{HTO&DhH<W|?Kxmc7n(SHc;@BLB=sOb^x0;DzhPDdCCKh?@5sQgE zQ>l3Kv7f!zlus9oJ4W?B{-^qm!wx^G@fB--{JUH0mh;=cwK%~4T%KNwwb%p%6u#p? z;SYtE!cZ%$=cDO_Bk;}W2Q)bTC?;!4%Op3I5(Gb>q@Z$%k{wg)TH;hB__6wh%0d4A zwIA;O$b$J_-&+d~@bi}&m+-SNQ-hu@V^x_PU&@fJfwd9d^akDp;sjc$iZ;I$H81-7 z))&%30f@kuhY2DuSCL{-M$iVK2c1L)B1MA-z2D;B9Ny3G@0ND5nEeM?^bU4< z)TNnIE{z(@-_(EyQJa%P#$JCA^R!kgodc?{6!lRsWQvLZ3`D^Sy zg0d96VRGTmnn-kWs5fgloNo$r}(Vl1{)+3deQctNg6|fq}w<}gu%j)jBJk$YCX(d#Zh;`biiJDfiE(~YNhEgCj4mQ9c&_VWo@ zk^~9$kbg67*}#u>t~{QO8U?I3n;(}cuiplG#X`k;g|MfyHDp*K2IM?2Ermn=&9S{$ zdeu<@BO~ITuCZpq8l-cWr+g`WVk@!uBGYr$|2KVA^HB@uFT4;TQ6b48nISnLuu_25 z&@JExrS5A6vjo^*$#7XApn#@UnmyRTFR-ShPu^U(=*{)nty*U1^=Xklxq57^4t<)} zBF~uhQ13~Tde_U!s>i&thr%(YxyJ;|2J?+9#h~7Iq_^O6iX=#l?Ih zY;&rg`PDWOF`i)PzuVMM(V4ISx%Xa9erQ5cQ{cyhu{swZsxnI<&6%%8`NIi$7cVBF zgOD<66#tAl8%UDa1rqiHDO1`iG7Tu(z?vq8!XkEL8|moJS7@C|S$F9$Wgj3DVZ^gX zKmLrCr2(#1r2$Ar$mdIZ?ebtx(Xf=@FqiLzgYHf6kOcHh$G8}QX+oU%}7@Q@TM6jTaVEnBnCVWg*{e{&^O^&HsFQn-?F-SW$viouhHX9^TFbDUdRSRkbPH zRO6ADD6_mfHP4*z$o+Haj}N4?Y^ybD*Md?EWchH^1pcHnMZUHls{$?WMV}@Q=ry!9 zAH&*A%Ms}a`a)d_D6uI~MMu)uqLp4l|1_W)I3Yz9rBqP|L#ie|#3`-YJ<9v($1`v4 zpL4(V*%Jr54?@dr`9f*>zJg`rl~{~;!P!qhuYxClSroETW~hNxs}YL>EmwBZfT+OK zm!$J%0WKZwRVhMvs(i&8@m2J}GSq9RA-+1_G)~@xD6+tjk4M z0G80eknm7BFh-$_ljwR%oiO|SD;Z5n_!CUAY0D}e+qbvqT~_@Wk}DFwE3=eY?(bre zzt!nACD!Y^cfP$LugO2KV&27HdFc<1#El&TSTiz? z{*&K6H1fW+Zkgpy!sp)-o>?p&L<4b_DQb9pf{O-3F28<`u3=KNDVJ$T7ec&H^$J~> z+J;3TPbrH2f&xDSb%0r_L7^mm)ClngE((A0E@|U~b z6!cU9S^V!?n!*N7R>6g|eQJzLU@4NQjz?nJOa_v63%!kguQX>BjZkQiXq)tRuMx8b zj_wrIsKMASRhrgXk=uK0^=TElwQ3t@VP(g88#Wjd8fY$;t}_U(fd`n>I$vin0<;)P z#Higql?`V5HZ-j3SE<>O{6F>-1a0ws{|Bl0JMj* z@7avr7Fc^UnDS=v{fc4Y``5+y&+S37MDjLry4XW`%PX3g6Y@*ng^(*)xaw#3Czg&> zLGssY)3cGpZp?2(Y#0Gh1IyMlYlL2%*{GDvR3|l++}+sR^wXzzu9>%M{L-As zX^qpntWSGm_qy?uSIFNy-8;8uR&uQ@l6lLdWR_~p74b5PmKn9M)P4J;WI0Cc8HPW@ zENh%C1#^wGfZYfLW|joBV#~1ZN1jxMwp$Zp7P1o4>Q(#y!`*v;Sy5#D!(Dy*-aA8@ z2tyu*ff@1u0}O%^lqgYH1wkaPfPjD^pcpVL0ul@$DgwIts<4Q6?y~BjE=Uw3CQKlh zv!a3l=Jx&n&Z(~I?mKtT_1*vXeBZbGI866cpE`Bwq&ju#6jrMkEi$t#SLUf>xaoYi z8s#M6i~~)SdFGRwo_J!@lL6aaCg$8O>f4|2+{91X7m87G4)7u*mOWp^izoPq@D#?) z@iS1E>%zqG1lqzuz{73R(q1I+Qk%~%cPs0=h6I^bnav|5nkXVtJ*!#kTu z%-CM-)oMI@Ue7;*m7BLnBjQk55CT*L&c|geoJov<;uAZ0Y_(9FEBe82r> z^*ch{2omA9H2zKCH~8&&6m=&<Z&*)>J^QEa`m6oj z#wXtX*SsnJDqb*g!ud-?VK@6kEM%T|{owf%>?hJ5T(tQmj;;2DZuZ^b=i_akkILE~ zRu~I{{EQ&#P2x0{Rkh46x35I8dU11EV9PJD{zJ@XaDj1q(5n1Kd#wFUd;#)V8c_y@ zTt;s-g6TnIQ^H*)LcrY-#5LIV#rAZ^;@A^+-EYr6wa$KRQxz&4T?I4;V=#^(bzcsn zr5p-2T)JlC^cN3 zOKsKQ{Cdd1oSheNMM;APRRNok4db zk|T{f5`6C?*`jMOa&oA-#C&^bY%a#K-svwz-6+XaQS>_PSO6bG`O= z->>mbb_b@KQsyDGa98u2CFl2Zd-8Ho5HAzQ?P^xrF6Af0K65FkB8=PrJZ#DH_B#Z- zrpPTbe~6_4cr4#MEV+kpC%=qjKlyx~7I!(HPuVk8pb*BnWr4TLn-lo+0wBd4-rS3Wx)VD#gGTM@0O(%Ey0-6PVU&BI(8uhc8%^0JQIC zh*pCg2C$l<}8n`Px5XPFr)m9aF8mnGU;EuUEkF*!* z@ICg*o5X$Qz+h%<9-u=c0T-TzpWc6rCLX+>w|@ax(X34L4%D}s5#DL$4+`%&4t&jj zKAHDTu7~C#pvkiSjQ#P))0_E)IZNb_Amzxz=4!S?D#XTGhf+w9NnFKz_v zoH8mHG{k(}PPafDg54)^t}BP_!#hkuK$`a#d;W5|?WfE-`c-+AE|w|4J_2{#D;?(0 z-p4lo!925p+HPZ-+lsEN&}f=V0{f*5BhURby3*H=nqx?q2y0%w?jsZuC0>2_-I-#J z!>Yo-uDf5xe5%GrBoEvS58y|CLYXGfoJ4Ha7XYm!Oc+}=&JB|21s^z3fJL=HD*+*m4l>Sn%|FG+_V4@fyE|#tfhG0KUe6mUR;n1RT(!vXJr2Yf@>WSFa zXw1GBfr3hBsTbJAQT&jMwoDu;dPD#R+!TAwM6pQJE;C;fBWEHdJyUw3gdZ|KmOCoYC_tzFPANkk57ZmNX~Av_lP@*%a*Jo4wH14=HMJkN(bK> z%4Ih4#=vbL1Jq)RGE#`=Irpn^8$u#RI9n z{d6S*N~WS#3Wa>J!RC#Ds+AbY20Urv1c6)B%q8~Imx(!KKg}gcxEl)yJJVhvo?E1!K-EFTT>9j_JnDuednrDgcQ zo*~AIzrg<5->%cXkAkn~%tr?g{N#Kq;md{4W_tt1&=_+jdatv;Ge;=hpk(8}(1(%@ z(VL_rE6`r`;o3?^{*u$ll5_&^c`A33p(irQVJx!`Vi;8+;Ok;T0&0DGf1+;o*-u|* z-Z{<)NCnD%+k4Bg1|V%D_LZN&EW<*dAYQDnF5;z-Vj16rC|?&04ndJlAz*)Im#qM7 zB#VQ|UpZ91mY{zvD9s-5UD_nGonCYuw}f25T`>|tVB6_O2%ue+9YJr*rIWOCKKb)8 zzB2rkFB1Pndg*S_gwTd^I{B?1-&7UX@sS{@uNFaSlz(yLycpZ^-o zl%&CSE?Mu|&an>7{**lq42xBtXx>(4&NW}08Cz{mOSBtK9L&d4J{l>W`V-EiG}zl9 z56YL+>sH^q`zA=u2~>n!PC6ky$FHE^8vJSnR$Wz9eYI*j`HPbf0Jj(H+PBn zFghnNEoFh9V?!_}K3sku2D^YXBzA+v6>x&B4;hAQXHM$_holdTGDm)m4QjEoLO$>b zI4dp097b^+FEc?e72ilzrf1KLv+MiKO<6cphY7+MZxp&i5H&7 zRoiF(Dnnv{T)QbI6LHxR;HF}D+Q;$Dfs!92#Io-j@EtVw`o3mudj-K~k%`Skc*hYL z^s!3wwKLC^kKYyfxV@X;ky~~mwhstn@lGNSc$j%-&EmkTbo_F=$k{DI6kr{8i>#x+ z#99-6R}d_vQ~%K1@QRwI`7kk26OqRpO|0|{a)BXUUV8pF^-&IoN#(+V0;O*|3kx@n z^ZUF&b^yT^LjP@`|C1P5W_66EBfRiMU^degAu}f);>5Ik^W;->ipfrA5RTc8-6ozv zP!5jcrYnGLp=qOgh{892sg*cs$zmqZ!k4YJ9 z(uSU{_SgrgtDa?n=gT{zBWJg4Q+coVS`}O;CEDeIIm_D?>rUd~7 z*UiJRd}v}OH)?V_uyriOXAYTv$j(=~l_{;RIS`I$c`?B9Rwi&(c1zRNH;0N9d8R0C zKstUBhfm%f;shf8Gn=J=NJGIC{5F6f7tyamtjk9~g-Zn%BH;@HH}w{9pcq_c zR*M~n@;GI7m%5`uO!kk%&T(KX$u^Hcvagu=MPL>i?Ibj;+?~LVBZXer@>9S7x>EYP zuC7eRJEt8xg(7{5Q{ZZ5M{%-WRbe02x0YnszJ;Z77?t-(3rpgCG9V;e@7l{DsMcCh zlN`6#PK}4K()?BMU3|RcbDPNpB0{k15?E`03)iLc_(RgUiiY^2101(b?lVZDs0atS zN9!O|OM$0L>)*AR9`*EreV8J>w8w%gT)v_OFmJL5oODz=*YR=w7x=2B96CY3ghV4r z9MNYk6kY#FyypwJP+i3=j#aI5HlUK=?^E3#_`e_TQRJp61-YFm#Tb+?r1y@K@Z~WS2YcMr04S=t* zmzoYfzOGz}f-PkDQl~;#ohTKeE2Tm>Ywim1Gav4!g{^aRWMYANA>|cxEx+fm6qqFI z`9BU@=Z9Rfg7QNGXCR2yt}F6G_BeY`N>22efyu1Yv*Noy9O?jfUoN_kBP4p6?+ii8 z59nUO$M?})%_~HOme#lloAwZ|p^T+_g;gdlCpfKtv1nU9$@EP!21F6mdowu@#9| z(?BC;D~uP*bZ33^yD_tzQDd}xmf&5nYh9-yOyVZ<GJp z1(QA!H?m%X2lK9lZ35T7((y G(WQ!j;`E@ht~h$Q=Ys6(9N2FgaRcmQu6?XN?)= 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 XwkE6s{u4>Ex2wa?N-FMLe0cu@Z#UM5 diff --git a/src/ImGuiAdvanced/scene_shaders.shd b/src/ImGuiAdvanced/scene_shaders.shd deleted file mode 100644 index ad68352..0000000 --- a/src/ImGuiAdvanced/scene_shaders.shd +++ /dev/null @@ -1,21 +0,0 @@ -//------------------------------------------------------------------------------ -// scene_shaders.shd -@uniform_block vsParams Params -mat4 mvp ModelViewProjection -@end - -@vs vs -@use_uniform_block vsParams -@in vec4 position -@in vec4 normal -@out vec4 nrm - _position = mul(mvp, position); - nrm = normal; -@end - -@fs fs -@in vec4 nrm - _color = vec4(nrm.xyz * 0.5 + 0.5, 1.0); -@end - -@program SceneShader vs fs From e8d7b899d5fafcb41f867f36a76975c0f08f2389 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Tue, 24 Apr 2018 19:50:07 +0200 Subject: [PATCH 10/24] Fix Paclone sample --- src/Paclone/Paclone.cc | 54 ++++++++++++++++++++----------------- src/Paclone/canvas.cc | 60 ++++++++++++++++++++++++------------------ src/Paclone/canvas.h | 2 +- 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/Paclone/Paclone.cc b/src/Paclone/Paclone.cc index 9d41b7f..453f1ea 100644 --- a/src/Paclone/Paclone.cc +++ b/src/Paclone/Paclone.cc @@ -7,6 +7,7 @@ #include "Input/Input.h" #include "Dbg/Dbg.h" #include "Sound/Sound.h" +#include "Assets/Gfx/FullscreenQuadBuilder.h" #include "canvas.h" #include "game.h" #include "shaders.h" @@ -43,6 +44,11 @@ class PacloneApp : public App { int viewPortW = 0; int viewPortH = 0; Direction input = NoDirection; + + const int canvasWidth = Width * 8; + const int canvasHeight = Height * 8; + const int dispWidth = canvasWidth * 2; + const int dispHeight = canvasHeight * 2; }; OryolMain(PacloneApp); @@ -51,35 +57,35 @@ AppState::Code PacloneApp::OnInit() { this->tick = 0; - const int canvasWidth = Width * 8; - const int canvasHeight = Height * 8; - const int dispWidth = canvasWidth * 2; - const int dispHeight = canvasHeight * 2; - Gfx::Setup(GfxSetup::Window(dispWidth, dispHeight, "Oryol Pacman Clone Sample")); + Gfx::Setup(GfxDesc().Width(dispWidth).Height(dispHeight).Title("Oryol Pacman Clone Sample")); Input::Setup(); Sound::Setup(SoundSetup()); - Dbg::Setup(); + Dbg::Setup(DbgDesc().DepthFormat(PixelFormat::None)); // setup a offscreen render target, copy-shader and texture block - auto rtSetup = TextureSetup::RenderTarget2D(canvasWidth, canvasHeight); - rtSetup.Sampler.MinFilter = TextureFilterMode::Linear; - rtSetup.Sampler.MagFilter = TextureFilterMode::Linear; - Id canvasTexture = Gfx::CreateResource(rtSetup); - this->canvasPass = Gfx::CreateResource(PassSetup::From(canvasTexture)); - - auto quadSetup = MeshSetup::FullScreenQuad(Gfx::QueryFeature(GfxFeature::OriginTopLeft)); - this->canvasDrawState.Mesh[0] = Gfx::CreateResource(quadSetup); + this->canvasDrawState.FSTexture[0] = Gfx::CreateTexture(TextureDesc() + .RenderTarget(true) + .Type(TextureType::Texture2D) + .Width(canvasWidth) + .Height(canvasHeight) + .MinFilter(TextureFilterMode::Linear) + .MagFilter(TextureFilterMode::Linear)); + this->canvasPass = Gfx::CreatePass(PassDesc() + .ColorAttachment(0, this->canvasDrawState.FSTexture[0])); + + auto fsq = FullscreenQuadBuilder() + .FlipV(Gfx::QueryFeature(GfxFeature::OriginTopLeft)) + .Build(); + this->canvasDrawState.VertexBuffers[0] = Gfx::CreateBuffer(fsq.VertexBufferDesc); #if USE_CRTEFFECT - Id shd = Gfx::CreateResource(CRTShader::Setup()); + Id shd = Gfx::CreateShader(CRTShader::Desc()); #else - Id shd = Gfx::CreateResource(NoCRTShader::Setup()); + Id shd = Gfx::CreateShader(NoCRTShader::Desc()); #endif - auto ps = PipelineSetup::FromLayoutAndShader(quadSetup.Layout, shd); - this->canvasDrawState.Pipeline = Gfx::CreateResource(ps); - this->canvasDrawState.FSTexture[0] = canvasTexture; + this->canvasDrawState.Pipeline = Gfx::CreatePipeline(PipelineDesc(fsq.PipelineDesc).Shader(shd)); // setup canvas and game state - this->spriteCanvas.Setup(rtSetup, Width, Height, 8, 8, NumSprites); + this->spriteCanvas.Setup(PixelFormat::RGBA8, Width, Height, 8, 8, NumSprites); this->sounds.CreateSoundEffects(); this->gameState.Init(&this->spriteCanvas, &this->sounds); @@ -90,8 +96,8 @@ PacloneApp::OnInit() { void PacloneApp::applyViewPort() { float aspect = float(Width) / float(Height); - const int fbWidth = Gfx::DisplayAttrs().FramebufferWidth; - const int fbHeight = Gfx::DisplayAttrs().FramebufferHeight; + const int fbWidth = Gfx::DisplayAttrs().Width; + const int fbHeight = Gfx::DisplayAttrs().Height; this->viewPortY = 0; this->viewPortH = fbHeight; this->viewPortW = (const int) (fbHeight * aspect); @@ -109,14 +115,14 @@ PacloneApp::OnRunning() { // render into offscreen render target Gfx::BeginPass(this->canvasPass); this->spriteCanvas.Render(); - Dbg::DrawTextBuffer(); + Dbg::DrawTextBuffer(canvasWidth, canvasHeight); Gfx::EndPass(); // copy offscreen render target into backbuffer Gfx::BeginPass(); this->applyViewPort(); Gfx::ApplyDrawState(this->canvasDrawState); - Gfx::Draw(); + Gfx::Draw(0, 4); Gfx::EndPass(); Gfx::CommitFrame(); this->tick++; diff --git a/src/Paclone/canvas.cc b/src/Paclone/canvas.cc index dbe4108..80dcf25 100644 --- a/src/Paclone/canvas.cc +++ b/src/Paclone/canvas.cc @@ -22,7 +22,7 @@ numVertices(0) { //------------------------------------------------------------------------------ void -canvas::Setup(const TextureSetup& rtSetup, int tilesX, int tilesY, int tileW, int tileH, int numSpr) { +canvas::Setup(PixelFormat::Code format, int tilesX, int tilesY, int tileW, int tileH, int numSpr) { o_assert(!this->isValid); o_assert((tilesX > 0) && (tilesX <= MaxWidth) && (tilesY > 0) && (tilesY <= MaxHeight)); o_assert(numSpr < MaxNumSprites); @@ -37,31 +37,41 @@ canvas::Setup(const TextureSetup& rtSetup, int tilesX, int tilesY, int tileW, in this->numSprites = numSpr; this->numVertices = (this->numTilesX * this->numTilesY + this->numSprites) * 6; + VertexLayout layout = { + { "position", VertexFormat::Float2 }, + { "texcoord0", VertexFormat::Float2 } + }; + // setup draw state with dynamic mesh - auto meshSetup = MeshSetup::Empty(this->numVertices, Usage::Stream); - meshSetup.Layout - .Add(VertexAttr::Position, VertexFormat::Float2) - .Add(VertexAttr::TexCoord0, VertexFormat::Float2); - meshSetup.AddPrimitiveGroup(PrimitiveGroup(0, this->numVertices)); - this->drawState.Mesh[0] = Gfx::CreateResource(meshSetup); - Id shd = Gfx::CreateResource(CanvasShader::Setup()); - auto ps = PipelineSetup::FromLayoutAndShader(meshSetup.Layout, shd); - ps.BlendState.BlendEnabled = true; - ps.BlendState.SrcFactorRGB = BlendFactor::SrcAlpha; - ps.BlendState.DstFactorRGB = BlendFactor::OneMinusSrcAlpha; - ps.BlendState.ColorFormat = rtSetup.ColorFormat; - ps.BlendState.DepthFormat = rtSetup.DepthFormat; - ps.RasterizerState.CullFaceEnabled = false; - this->drawState.Pipeline = Gfx::CreateResource(ps); + this->drawState.VertexBuffers[0] = Gfx::CreateBuffer(BufferDesc() + .Type(BufferType::VertexBuffer) + .Size(this->numVertices * layout.ByteSize()) + .Usage(Usage::Stream)); + + Id shd = Gfx::CreateShader(CanvasShader::Desc()); + this->drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(shd) + .Layout(0, layout) + .BlendEnabled(true) + .BlendSrcFactorRGB(BlendFactor::SrcAlpha) + .BlendDstFactorRGB(BlendFactor::OneMinusSrcAlpha) + .ColorFormat(format) + .DepthFormat(PixelFormat::None) + .CullFaceEnabled(false)); // setup sprite texture - auto texSetup = TextureSetup::FromPixelData2D(Sheet::Width, Sheet::Height, 1, PixelFormat::RGBA8); - texSetup.Sampler.MinFilter = TextureFilterMode::Nearest; - texSetup.Sampler.MagFilter = TextureFilterMode::Nearest; - texSetup.Sampler.WrapU = TextureWrapMode::ClampToEdge; - texSetup.Sampler.WrapV = TextureWrapMode::ClampToEdge; - texSetup.ImageData.Sizes[0][0] = Sheet::NumBytes; - this->drawState.FSTexture[0] = Gfx::CreateResource(texSetup, Sheet::Pixels, Sheet::NumBytes); + this->drawState.FSTexture[0] = Gfx::CreateTexture(TextureDesc() + .Type(TextureType::Texture2D) + .Width(Sheet::Width) + .Height(Sheet::Height) + .NumMipMaps(1) + .Format(PixelFormat::RGBA8) + .MinFilter(TextureFilterMode::Nearest) + .MagFilter(TextureFilterMode::Nearest) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge) + .MipSize(0, 0, Sheet::NumBytes) + .MipContent(0, 0, Sheet::Pixels)); // initialize the tile map for (int y = 0; y < this->numTilesY; y++) { @@ -93,9 +103,9 @@ canvas::Render() { o_assert(this->isValid); int numBytes = 0; const void* data = this->updateVertices(numBytes); - Gfx::UpdateVertices(this->drawState.Mesh[0], data, numBytes); + Gfx::UpdateBuffer(this->drawState.VertexBuffers[0], data, numBytes); Gfx::ApplyDrawState(this->drawState); - Gfx::Draw(); + Gfx::Draw(0, this->numVertices); } //------------------------------------------------------------------------------ diff --git a/src/Paclone/canvas.h b/src/Paclone/canvas.h index 4366bec..c7d5fb2 100644 --- a/src/Paclone/canvas.h +++ b/src/Paclone/canvas.h @@ -16,7 +16,7 @@ class canvas { canvas(); /// setup the canvas - void Setup(const Oryol::TextureSetup& rtSetup, int numTilesX, int numTilesY, int tileWidth, int tileHeight, int numSprites); + void Setup(Oryol::PixelFormat::Code format, int numTilesX, int numTilesY, int tileWidth, int tileHeight, int numSprites); /// discard the cancas void Discard(); /// return true if canvas has been setup From f9a294494362424758e24a8afefe3fd524a80812 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 09:59:20 +0200 Subject: [PATCH 11/24] Fixed SoloudMOD and SoloudTedSid samples --- src/SoloudMOD/SoloudMOD.cc | 15 ++++++--------- src/SoloudTedSid/SoloudTedSid.cc | 15 ++++++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/SoloudMOD/SoloudMOD.cc b/src/SoloudMOD/SoloudMOD.cc index 652b5eb..5d9854f 100644 --- a/src/SoloudMOD/SoloudMOD.cc +++ b/src/SoloudMOD/SoloudMOD.cc @@ -37,7 +37,7 @@ class SoloudMODApp : public App { float volume = 1.5f; bool valid = false; bool failed = false; - Buffer data; + MemoryBuffer data; }; StaticArray mods; }; @@ -47,7 +47,7 @@ OryolMain(SoloudMODApp); AppState::Code SoloudMODApp::OnRunning() { - Gfx::BeginPass(PassAction::Clear(glm::vec4(0.2f, 0.4f, 0.8f, 1.0f))); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.4f, 0.8f, 1.0f)); IMUI::NewFrame(); float* buf = this->soloud.getWave(); @@ -103,13 +103,10 @@ SoloudMODApp::OnRunning() { //------------------------------------------------------------------------------ AppState::Code SoloudMODApp::OnInit() { - - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("snd:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); - - Gfx::Setup(GfxSetup::Window(800, 500, "SoLoud MOD Demo")); + IO::Setup(IODesc() + .Assign("snd:", ORYOL_SAMPLE_URL) + .FileSystem("http", HTTPFileSystem::Creator())); + Gfx::Setup(GfxDesc().Width(800).Height(500).Title("SoLoud MOD Demo")); Input::Setup(); IMUI::Setup(); diff --git a/src/SoloudTedSid/SoloudTedSid.cc b/src/SoloudTedSid/SoloudTedSid.cc index 136fdbe..b6d8199 100644 --- a/src/SoloudTedSid/SoloudTedSid.cc +++ b/src/SoloudTedSid/SoloudTedSid.cc @@ -40,7 +40,7 @@ class SoloudTedSidApp : public App { float filterParam2[4]; float music1Volume = 1.0f; float music2Volume = 0.0f; - Buffer music1Data, music2Data; + MemoryBuffer music1Data, music2Data; }; OryolMain(SoloudTedSidApp); @@ -59,7 +59,7 @@ SoloudTedSidApp::OnRunning() { float* buf = this->soloud.getWave(); float* fft = this->soloud.calcFFT(); - Gfx::BeginPass(PassAction::Clear(glm::vec4(0.2f, 0.4f, 0.8f, 1.0f))); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.4f, 0.8f, 1.0f)); IMUI::NewFrame(); ImGui::SetNextWindowPos(ImVec2(500, 20), ImGuiSetCond_Once); ImGui::Begin("Output"); @@ -149,13 +149,10 @@ SoloudTedSidApp::OnRunning() { //------------------------------------------------------------------------------ AppState::Code SoloudTedSidApp::OnInit() { - - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("snd:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); - - Gfx::Setup(GfxSetup::Window(800, 460, "SoLoud TED/SID Demo")); + IO::Setup(IODesc() + .Assign("snd:", ORYOL_SAMPLE_URL) + .FileSystem("http", HTTPFileSystem::Creator())); + Gfx::Setup(GfxDesc().Width(800).Height(460).Title("SoLoud TED/SID Demo")); Input::Setup(); IMUI::Setup(); From de3f25f352688d3cbd313b6118aab94b9566c92b Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 10:02:54 +0200 Subject: [PATCH 12/24] Fixed SoundTest sample --- src/SoundTest/SoundTest.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/SoundTest/SoundTest.cc b/src/SoundTest/SoundTest.cc index 213b6c8..51e3e6f 100644 --- a/src/SoundTest/SoundTest.cc +++ b/src/SoundTest/SoundTest.cc @@ -67,9 +67,7 @@ const char* SoundTestApp::uiEffectNames[SoundTestApp::NumEffects] = { //------------------------------------------------------------------------------ AppState::Code SoundTestApp::OnInit() { - auto gfxSetup = GfxSetup::Window(1024, 480, "Sound Test"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.75f, 0.75f, 0.75f, 1.0f)); - Gfx::Setup(gfxSetup); + Gfx::Setup(GfxDesc().Width(1024).Height(480).Title("Sound Test")); Input::Setup(); Sound::Setup(SoundSetup()); IMUI::Setup(); @@ -374,7 +372,7 @@ SoundTestApp::OnInit() { //------------------------------------------------------------------------------ AppState::Code SoundTestApp::OnRunning() { - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.75f, 0.75f, 0.75f, 1.0f)); IMUI::NewFrame(); // draw UI From c503d99db41820a8234dd577007b9a78e5bd959a Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 10:13:46 +0200 Subject: [PATCH 13/24] Fixed DrawCallExplorer --- src/DrawCallExplorer/DrawCallExplorer.cc | 67 +++++++++++++----------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/src/DrawCallExplorer/DrawCallExplorer.cc b/src/DrawCallExplorer/DrawCallExplorer.cc index 22dfa99..fa4f6b1 100644 --- a/src/DrawCallExplorer/DrawCallExplorer.cc +++ b/src/DrawCallExplorer/DrawCallExplorer.cc @@ -33,7 +33,9 @@ class DrawCallExplorerApp : public App { int curNumParticles = 0; int numParticlesPerBatch = 1000; - Id mesh; + Id vertexBuffer; + Id indexBuffer; + PrimitiveGroup primGroup; StaticArray pipelines; glm::mat4 view; @@ -91,12 +93,13 @@ DrawCallExplorerApp::OnRunning() { afterUpdate = Clock::Now(); // render block - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.5f, 0.5f, 0.5f, 1.0f)); afterApplyRt = Clock::Now(); int batchCount = this->numParticlesPerBatch; int curBatch = 0; DrawState drawState; - drawState.Mesh[0] = this->mesh; + drawState.VertexBuffers[0] = this->vertexBuffer; + drawState.IndexBuffer = this->indexBuffer; for (int i = 0; i < this->curNumParticles; i++) { if (++batchCount >= this->numParticlesPerBatch) { batchCount = 0; @@ -109,7 +112,7 @@ DrawCallExplorerApp::OnRunning() { } this->perParticleParams.particleTranslate = this->particles[i].pos; Gfx::ApplyUniformBlock(this->perParticleParams); - Gfx::Draw(); + Gfx::Draw(this->primGroup); } afterDraw = Clock::Now(); this->frameInfoBeforeUI = Gfx::FrameInfo(); @@ -151,8 +154,8 @@ DrawCallExplorerApp::emitParticles() { for (int i = 0; (this->curNumParticles < this->maxNumParticles) && (i < this->numEmitParticles); - i++) { - + i++) + { this->particles[this->curNumParticles].pos = glm::vec4(0.0f, 0.0f, 0.0f, 0.0f); glm::vec3 rnd = glm::ballRand(0.5f); rnd.y += 2.0f; @@ -191,40 +194,42 @@ DrawCallExplorerApp::reset() { AppState::Code DrawCallExplorerApp::OnInit() { // setup rendering system - GfxSetup gfxSetup = GfxSetup::Window(620, 500, "Oryol DrawCallExplorer"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); - gfxSetup.GlobalUniformBufferSize = 1024 * 1024 * 32; - Gfx::Setup(gfxSetup); + Gfx::Setup(GfxDesc() + .Width(620) + .Height(500) + .Title("Oryol DrawCallExplorer") + .GlobalUniformBufferSize(1024 * 1024 * 32)); Input::Setup(); IMUI::Setup(); // create resources const glm::mat4 rot90 = glm::rotate(glm::mat4(), glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f)); - ShapeBuilder shapeBuilder; - shapeBuilder.RandomColors = true; - shapeBuilder.Layout - .Add(VertexAttr::Position, VertexFormat::Float3) - .Add(VertexAttr::Color0, VertexFormat::Float4); - shapeBuilder.Transform(rot90).Sphere(0.05f, 3, 2); - this->mesh = Gfx::CreateResource(shapeBuilder.Build()); + auto shape = ShapeBuilder() + .RandomColors(true) + .Positions("position", VertexFormat::Float3) + .Colors("color0", VertexFormat::Float4) + .Transform(rot90) + .Sphere(0.05f, 3, 2) + .Build(); + this->vertexBuffer = Gfx::CreateBuffer(shape.VertexBufferDesc); + this->indexBuffer = Gfx::CreateBuffer(shape.IndexBufferDesc); + this->primGroup = shape.PrimitiveGroups[0]; - Id redShd = Gfx::CreateResource(RedShader::Setup()); - Id greenShd = Gfx::CreateResource(GreenShader::Setup()); - Id blueShd = Gfx::CreateResource(BlueShader::Setup()); + Id redShd = Gfx::CreateShader(RedShader::Desc()); + Id greenShd = Gfx::CreateShader(GreenShader::Desc()); + Id blueShd = Gfx::CreateShader(BlueShader::Desc()); - auto ps = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, redShd); - ps.RasterizerState.CullFaceEnabled = true; - ps.DepthStencilState.DepthWriteEnabled = true; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - this->pipelines[0] = Gfx::CreateResource(ps); - ps.Shader = greenShd; - this->pipelines[1] = Gfx::CreateResource(ps); - ps.Shader = blueShd; - this->pipelines[2] = Gfx::CreateResource(ps); + auto psDesc = PipelineDesc(shape.PipelineDesc) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true); + this->pipelines[0] = Gfx::CreatePipeline(psDesc.Shader(redShd)); + this->pipelines[1] = Gfx::CreatePipeline(psDesc.Shader(greenShd)); + this->pipelines[2] = Gfx::CreatePipeline(psDesc.Shader(blueShd)); // setup projection and view matrices - const float fbWidth = (const float) Gfx::DisplayAttrs().FramebufferWidth; - const float fbHeight = (const float) Gfx::DisplayAttrs().FramebufferHeight; + const float fbWidth = (const float) Gfx::DisplayAttrs().Width; + const float fbHeight = (const float) Gfx::DisplayAttrs().Height; this->proj = glm::perspectiveFov(glm::radians(45.0f), fbWidth, fbHeight, 0.01f, 100.0f); this->view = glm::lookAt(glm::vec3(0.0f, 2.5f, 0.0f), glm::vec3(0.0f, 0.0f, -10.0f), glm::vec3(0.0f, 1.0f, 0.0f)); this->model = glm::mat4(); From 98acad8b4f6cbec39b121335de7ef48bb92ed39f Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 11:25:19 +0200 Subject: [PATCH 14/24] Fixed OrbViewer (but a resource registry cleanup bug is remaining) --- src/Common/OrbLoader.cc | 2 ++ src/Common/OrbModel.h | 2 ++ src/OrbViewer/Main.cc | 76 +++++++++++++++++++++++------------------ 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/Common/OrbLoader.cc b/src/Common/OrbLoader.cc index f3a92e8..b796b69 100644 --- a/src/Common/OrbLoader.cc +++ b/src/Common/OrbLoader.cc @@ -163,6 +163,8 @@ OrbLoader::Load(const MemoryBuffer& data, const StringAtom& name, OrbModel& mode auto meshDesc = makeMeshDesc(data.Data(), orb, name); model.VertexBufferDesc = meshDesc.vertexBufferDesc; model.IndexBufferDesc = meshDesc.indexBufferDesc; + model.Layout = meshDesc.layout; + model.IndexType = meshDesc.indexType; model.VertexBuffer = Gfx::CreateBuffer(model.VertexBufferDesc); model.IndexBuffer = Gfx::CreateBuffer(model.IndexBufferDesc); diff --git a/src/Common/OrbModel.h b/src/Common/OrbModel.h index 9a85d09..8299b42 100644 --- a/src/Common/OrbModel.h +++ b/src/Common/OrbModel.h @@ -27,6 +27,8 @@ struct OrbModel { bool IsValid = false; BufferDesc VertexBufferDesc; BufferDesc IndexBufferDesc; + VertexLayout Layout; + Oryol::IndexType::Code IndexType; glm::vec4 VertexMagnitude; Id VertexBuffer; Id IndexBuffer; diff --git a/src/OrbViewer/Main.cc b/src/OrbViewer/Main.cc index a26b0cb..46bfb2d 100644 --- a/src/OrbViewer/Main.cc +++ b/src/OrbViewer/Main.cc @@ -58,7 +58,7 @@ class Main : public App { } ui; int frameIndex = 0; - GfxSetup gfxSetup; + GfxDesc gfxDesc; Id shader; Id boneTexture; ImTextureID imguiBoneTextureId = nullptr; @@ -74,14 +74,16 @@ OryolMain(Main); //------------------------------------------------------------------------------ AppState::Code Main::OnInit() { - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("orb:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); - - this->gfxSetup = GfxSetup::WindowMSAA4(1024, 640, "Orb File Viewer"); - this->gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.1f, 0.1f, 0.2f, 1.0f)); - Gfx::Setup(this->gfxSetup); + IO::Setup(IODesc() +// .Assign("orb:", ORYOL_SAMPLE_URL) +.Assign("orb:", "http://localhost:8000/") + .FileSystem("http", HTTPFileSystem::Creator())); + this->gfxDesc = GfxDesc() + .Width(1024) + .Height(640) + .SampleCount(4) + .Title("Orb File Viewer"); + Gfx::Setup(this->gfxDesc); AnimSetup animSetup; animSetup.SkinMatrixTableWidth = BoneTextureWidth; animSetup.SkinMatrixTableHeight = BoneTextureHeight; @@ -92,18 +94,23 @@ Main::OnInit() { this->camera.Center = glm::vec3(0.0f, 1.0f, -2.5f); this->camera.Distance = 10.0f; this->camera.Orbital = glm::vec2(glm::radians(25.0f), glm::radians(-90.0f)); - this->wireframe.Setup(this->gfxSetup); + this->wireframe.Setup(this->gfxDesc); // can setup the shader before loading any assets - this->shader = Gfx::CreateResource(LambertShader::Setup()); + this->shader = Gfx::CreateShader(LambertShader::Desc()); // RGBA32F texture for the animated skeleton bone info - auto texSetup = TextureSetup::Empty2D(BoneTextureWidth, BoneTextureHeight, 1, PixelFormat::RGBA32F, Usage::Stream); - texSetup.Sampler.MinFilter = TextureFilterMode::Nearest; - texSetup.Sampler.MagFilter = TextureFilterMode::Nearest; - texSetup.Sampler.WrapU = TextureWrapMode::ClampToEdge; - texSetup.Sampler.WrapV = TextureWrapMode::ClampToEdge; - this->boneTexture = Gfx::CreateResource(texSetup); + this->boneTexture = Gfx::CreateTexture(TextureDesc() + .Type(TextureType::Texture2D) + .Width(BoneTextureWidth) + .Height(BoneTextureHeight) + .NumMipMaps(1) + .Format(PixelFormat::RGBA32F) + .Usage(Usage::Stream) + .MinFilter(TextureFilterMode::Nearest) + .MagFilter(TextureFilterMode::Nearest) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge)); this->imguiBoneTextureId = IMUI::AllocImage(); IMUI::BindImage(this->imguiBoneTextureId, this->boneTexture); @@ -137,20 +144,19 @@ Main::OnRunning() { // upload bone info to GPU texture const AnimSkinMatrixInfo& boneInfo = Anim::SkinMatrixInfo(); this->model.vsParams.skin_info = boneInfo.InstanceInfos[0].ShaderInfo; - ImageDataAttrs imgAttrs; - imgAttrs.NumFaces = 1; - imgAttrs.NumMipMaps = 1; - imgAttrs.Offsets[0][0] = 0; - imgAttrs.Sizes[0][0] = boneInfo.SkinMatrixTableByteSize; - Gfx::UpdateTexture(this->boneTexture, boneInfo.SkinMatrixTable, imgAttrs); + ImageContent imgContent; + imgContent.Pointer[0][0] = boneInfo.SkinMatrixTable; + imgContent.Size[0][0] = boneInfo.SkinMatrixTableByteSize; + Gfx::UpdateTexture(this->boneTexture, imgContent); } - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.1f, 0.1f, 0.2f, 1.0f)); if (this->model.orb.IsValid) { if (this->ui.meshEnabled) { DrawState drawState; drawState.Pipeline = this->model.pipeline; - drawState.Mesh[0] = this->model.orb.Mesh; + drawState.VertexBuffers[0] = this->model.orb.VertexBuffer; + drawState.IndexBuffer = this->model.orb.IndexBuffer; drawState.VSTexture[LambertShader::boneTex] = this->boneTexture; Gfx::ApplyDrawState(drawState); /* @@ -165,7 +171,7 @@ Main::OnRunning() { for (const auto& subMesh : this->model.orb.Submeshes) { if (subMesh.Visible) { //Gfx::ApplyUniformBlock(this->model.materials[subMesh.material].matParams); - Gfx::Draw(subMesh.PrimitiveGroupIndex); + Gfx::Draw(subMesh.PrimGroup); } } } @@ -433,14 +439,16 @@ Main::loadModel(const Locator& loc) { if (OrbLoader::Load(res.Data, "model", orb)) { orb.Submeshes[0].Visible = true; - auto pipSetup = PipelineSetup::FromLayoutAndShader(orb.MeshSetup.Layout, this->shader); - pipSetup.DepthStencilState.DepthWriteEnabled = true; - pipSetup.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pipSetup.RasterizerState.CullFaceEnabled = true; - pipSetup.RasterizerState.SampleCount = this->gfxSetup.SampleCount; - pipSetup.BlendState.ColorFormat = this->gfxSetup.ColorFormat; - pipSetup.BlendState.DepthFormat = this->gfxSetup.DepthFormat; - this->model.pipeline = Gfx::CreateResource(pipSetup); + this->model.pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(this->shader) + .Layout(0, orb.Layout) + .IndexType(orb.IndexType) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true) + .ColorFormat(this->gfxDesc.ColorFormat()) + .DepthFormat(this->gfxDesc.DepthFormat()) + .SampleCount(this->gfxDesc.SampleCount())); this->model.vsParams.vtx_mag = orb.VertexMagnitude; if (orb.AnimLib.IsValid()) { From 30b3300e5d3126427b1e0773a5c739d76e6d1d9c Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 11:27:00 +0200 Subject: [PATCH 15/24] Fixed OrbViewer URL --- src/OrbViewer/Main.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OrbViewer/Main.cc b/src/OrbViewer/Main.cc index 46bfb2d..c46eff8 100644 --- a/src/OrbViewer/Main.cc +++ b/src/OrbViewer/Main.cc @@ -75,8 +75,7 @@ OryolMain(Main); AppState::Code Main::OnInit() { IO::Setup(IODesc() -// .Assign("orb:", ORYOL_SAMPLE_URL) -.Assign("orb:", "http://localhost:8000/") + .Assign("orb:", ORYOL_SAMPLE_URL) .FileSystem("http", HTTPFileSystem::Creator())); this->gfxDesc = GfxDesc() .Width(1024) From 7585506d0c908eef9c5df40f64fbc6b86f58342b Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 16:40:27 +0200 Subject: [PATCH 16/24] OrbViewer: add a small 'Loading...' overlay --- src/OrbViewer/Main.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/OrbViewer/Main.cc b/src/OrbViewer/Main.cc index c46eff8..8b5012a 100644 --- a/src/OrbViewer/Main.cc +++ b/src/OrbViewer/Main.cc @@ -38,6 +38,7 @@ class Main : public App { void drawMainWindow(); void drawAnimControlWindow(); void drawBoneTextureWindow(); + void drawLoadingOverlay(); void loadModel(const Locator& loc); void drawModelDebug(const Model& model, const glm::mat4& modelMatrix); @@ -218,6 +219,9 @@ Main::drawUI() { this->drawBoneTextureWindow(); } } + else { + this->drawLoadingOverlay(); + } ImGui::Render(); } @@ -429,6 +433,22 @@ Main::drawModelDebug(const Model& model, const glm::mat4& modelTransform) { } } +//------------------------------------------------------------------------------ +void +Main::drawLoadingOverlay() { + const ImVec2 windowPos = ImVec2(ImGui::GetIO().DisplaySize.x/2, ImGui::GetIO().DisplaySize.y/2); + const ImVec2 windowPivot = ImVec2(0.5f, 0.5f); + ImGui::SetNextWindowPos(windowPos, ImGuiCond_Always, windowPivot); + ImGui::SetNextWindowBgAlpha(0.3f); + if (ImGui::Begin("#loading", nullptr, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize| + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings| + ImGuiWindowFlags_NoFocusOnAppearing|ImGuiWindowFlags_NoNav)) + { + ImGui::Text("Loading..."); + ImGui::End(); + } +} + //------------------------------------------------------------------------------ void Main::loadModel(const Locator& loc) { From 89fd4cab250745f456f93586e13c7ee655185cf2 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 17:06:59 +0200 Subject: [PATCH 17/24] Fix the Dragons sample --- src/Dragons/Dragons.cc | 117 +++++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 51 deletions(-) diff --git a/src/Dragons/Dragons.cc b/src/Dragons/Dragons.cc index fec43dc..8f5a22b 100644 --- a/src/Dragons/Dragons.cc +++ b/src/Dragons/Dragons.cc @@ -34,7 +34,7 @@ class Dragons : public App { static const int BoneTextureWidth = 1024; static const int BoneTextureHeight = MaxNumInstances/4 + 1; - GfxSetup gfxSetup; + GfxDesc gfxDesc; CameraHelper camera; Id shader; OrbModel orbModel; @@ -46,7 +46,7 @@ class Dragons : public App { // xxxx,yyyy,zzzz is transposed model matrix // boneInfo is position in bone texture - VertexLayout instanceMeshLayout; + VertexLayout instanceBufferLayout; struct InstanceVertex { float xxxx[4]; float yyyy[4]; @@ -70,14 +70,12 @@ OryolMain(Dragons); //------------------------------------------------------------------------------ AppState::Code Dragons::OnInit() { - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("orb:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); + IO::Setup(IODesc() + .Assign("orb:", ORYOL_SAMPLE_URL) + .FileSystem("http", HTTPFileSystem::Creator())); - this->gfxSetup = GfxSetup::WindowMSAA4(1024, 640, "Dragons"); - this->gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.2f, 0.3f, 0.5f, 1.0f)); - Gfx::Setup(this->gfxSetup); + this->gfxDesc = GfxDesc().Width(1024).Height(640).SampleCount(4).Title("Dragons"); + Gfx::Setup(this->gfxDesc); AnimSetup animSetup; animSetup.MaxNumInstances = MaxNumInstances; animSetup.MaxNumActiveInstances = MaxNumInstances; @@ -93,30 +91,36 @@ Dragons::OnInit() { this->camera.Orbital = glm::vec2(glm::radians(45.0f), 0.0f); // setup the shader now, pipeline setup happens when model file has loaded - this->shader = Gfx::CreateResource(DragonShader::Setup()); + this->shader = Gfx::CreateShader(DragonShader::Desc()); // RGBA32F texture for the animated skeleton bones - auto texSetup = TextureSetup::Empty2D(BoneTextureWidth, BoneTextureHeight, 1, PixelFormat::RGBA32F, Usage::Stream); - texSetup.Sampler.MinFilter = TextureFilterMode::Nearest; - texSetup.Sampler.MagFilter = TextureFilterMode::Nearest; - texSetup.Sampler.WrapU = TextureWrapMode::ClampToEdge; - texSetup.Sampler.WrapV = TextureWrapMode::ClampToEdge; - Id boneTexture = Gfx::CreateResource(texSetup); + Id boneTexture = Gfx::CreateTexture(TextureDesc() + .Type(TextureType::Texture2D) + .Width(BoneTextureWidth) + .Height(BoneTextureHeight) + .NumMipMaps(1) + .Format(PixelFormat::RGBA32F) + .Usage(Usage::Stream) + .MinFilter(TextureFilterMode::Nearest) + .MagFilter(TextureFilterMode::Nearest) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge)); this->drawState.VSTexture[DragonShader::boneTex] = boneTexture; this->imguiBoneTextureId = IMUI::AllocImage(); IMUI::BindImage(this->imguiBoneTextureId, boneTexture); - // vertex buffer for per-instance info - auto meshSetup = MeshSetup::Empty(MaxNumInstances, Usage::Stream); - meshSetup.Layout = { - { VertexAttr::Instance0, VertexFormat::Float4 }, // transposes model matrix xxxx - { VertexAttr::Instance1, VertexFormat::Float4 }, // transposes model matrix yyyy - { VertexAttr::Instance2, VertexFormat::Float4 }, // transposes model matrix zzzz - { VertexAttr::Instance3, VertexFormat::Float4 } // bone texture location - }; - meshSetup.Layout.EnableInstancing(); - this->instanceMeshLayout = meshSetup.Layout; - this->drawState.Mesh[1] = Gfx::CreateResource(meshSetup); + // vertex-layout and -buffer for per-instance info + this->instanceBufferLayout = VertexLayout() + .EnableInstancing() + .Add({ + { "instance0", VertexFormat::Float4 }, // transposes model matrix xxxx + { "instance1", VertexFormat::Float4 }, // transposes model matrix yyyy + { "instance2", VertexFormat::Float4 }, // transposes model matrix zzzz + { "instance3", VertexFormat::Float4 } // bone texture location + }); + this->drawState.VertexBuffers[1] = Gfx::CreateBuffer(BufferDesc() + .Size(MaxNumInstances * sizeof(InstanceVertex)) + .Usage(Usage::Stream)); // load the dragon.orb file and add the first model instance, // the .txt extension is a hack so that github pages compresses the file @@ -128,7 +132,7 @@ Dragons::OnInit() { //------------------------------------------------------------------------------ AppState::Code Dragons::OnRunning() { - if (!ImGui::IsMouseHoveringAnyWindow()) { + if (!ImGui::GetIO().WantCaptureMouse) { this->camera.HandleInput(); } this->camera.Center.z = -(this->numActiveInstances / 16) * 2.0f; @@ -151,12 +155,10 @@ Dragons::OnRunning() { // upload animated skeleton bone info to GPU texture TimePoint updTexStart = Clock::Now(); const AnimSkinMatrixInfo& boneInfo = Anim::SkinMatrixInfo(); - ImageDataAttrs imgAttrs; - imgAttrs.NumFaces = 1; - imgAttrs.NumMipMaps = 1; - imgAttrs.Offsets[0][0] = 0; - imgAttrs.Sizes[0][0] = boneInfo.SkinMatrixTableByteSize; - Gfx::UpdateTexture(this->drawState.VSTexture[DragonShader::boneTex], boneInfo.SkinMatrixTable, imgAttrs); + ImageContent imgContent; + imgContent.Size[0][0] = boneInfo.SkinMatrixTableByteSize; + imgContent.Pointer[0][0] = boneInfo.SkinMatrixTable; + Gfx::UpdateTexture(this->drawState.VSTexture[DragonShader::boneTex], imgContent); this->updateBoneTexDuration = Clock::Since(updTexStart).AsMilliSeconds(); // update the instance vertex buffer with bone texture locations @@ -170,21 +172,21 @@ Dragons::OnRunning() { } } if (instIndex > 0) { - Gfx::UpdateVertices(this->drawState.Mesh[1], this->InstanceData, sizeof(InstanceVertex)*instIndex); + Gfx::UpdateBuffer(this->drawState.VertexBuffers[1], this->InstanceData, sizeof(InstanceVertex)*instIndex); } this->updateInstBufDuration = Clock::Since(updInstStart).AsMilliSeconds(); } // all dragons rendered in a single draw call via hardware instancing TimePoint drawStart = Clock::Now(); - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.3f, 0.5f, 1.0f)); IMUI::NewFrame(); this->drawUI(); if (this->orbModel.IsValid) { Gfx::ApplyDrawState(this->drawState); this->vsParams.view_proj = this->camera.ViewProj; Gfx::ApplyUniformBlock(this->vsParams); - Gfx::Draw(PrimGroupIndex, this->numActiveInstances); + Gfx::Draw(this->orbModel.Submeshes[0].PrimGroup, this->numActiveInstances); } ImGui::Render(); Gfx::EndPass(); @@ -212,20 +214,20 @@ Dragons::loadModel(const Locator& loc) { // start loading the .orb file IO::Load(loc.Location(), [this](IO::LoadResult res) { if (OrbLoader::Load(res.Data, "model", this->orbModel)) { - this->drawState.Mesh[0] = this->orbModel.Mesh; + this->drawState.VertexBuffers[0] = this->orbModel.VertexBuffer; + this->drawState.IndexBuffer = this->orbModel.IndexBuffer; this->vsParams.vtx_mag = this->orbModel.VertexMagnitude; - - auto pipSetup = PipelineSetup::FromShader(this->shader); - pipSetup.Layouts[0] = this->orbModel.MeshSetup.Layout; - pipSetup.Layouts[1] = this->instanceMeshLayout; - pipSetup.DepthStencilState.DepthWriteEnabled = true; - pipSetup.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pipSetup.RasterizerState.CullFaceEnabled = true; - pipSetup.RasterizerState.SampleCount = this->gfxSetup.SampleCount; - pipSetup.BlendState.ColorFormat = this->gfxSetup.ColorFormat; - pipSetup.BlendState.DepthFormat = this->gfxSetup.DepthFormat; - this->drawState.Pipeline = Gfx::CreateResource(pipSetup); - + this->drawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(this->shader) + .Layout(0, this->orbModel.Layout) + .Layout(1, this->instanceBufferLayout) + .IndexType(this->orbModel.IndexType) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true) + .SampleCount(this->gfxDesc.SampleCount()) + .ColorFormat(this->gfxDesc.ColorFormat()) + .DepthFormat(this->gfxDesc.DepthFormat())); this->initInstances(); } }, @@ -296,7 +298,7 @@ Dragons::drawUI() { ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiSetCond_Once); if (ImGui::Begin("Dragons", nullptr)) { const int numBonesPerInst = Anim::Skeleton(this->orbModel.Skeleton).NumBones; - const int numTrisPerInst = this->orbModel.MeshSetup.PrimitiveGroup(PrimGroupIndex).NumElements / 3; + const int numTrisPerInst = this->orbModel.Submeshes[0].PrimGroup.NumElements / 3; ImGui::SliderInt("num instances", &this->numWantedInstances, 1, MaxNumInstances); ImGui::Text("num bones: %d\n", numBonesPerInst * this->numActiveInstances); ImGui::Text("num triangles: %d\n", numTrisPerInst * this->numActiveInstances); @@ -330,6 +332,19 @@ Dragons::drawUI() { ImGui::End(); } } + else { + const ImVec2 windowPos = ImVec2(ImGui::GetIO().DisplaySize.x/2, ImGui::GetIO().DisplaySize.y/2); + const ImVec2 windowPivot = ImVec2(0.5f, 0.5f); + ImGui::SetNextWindowPos(windowPos, ImGuiCond_Always, windowPivot); + ImGui::SetNextWindowBgAlpha(0.3f); + if (ImGui::Begin("#loading", nullptr, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize| + ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoSavedSettings| + ImGuiWindowFlags_NoFocusOnAppearing|ImGuiWindowFlags_NoNav)) + { + ImGui::Text("Loading..."); + ImGui::End(); + } + } } From 662ee8e7964c681d6107aaad2081bc11db84d3ba Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 25 Apr 2018 17:12:08 +0200 Subject: [PATCH 18/24] Fix mouse capture for ImGui in OrbViewer sample --- src/OrbViewer/Main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrbViewer/Main.cc b/src/OrbViewer/Main.cc index 8b5012a..7c91d15 100644 --- a/src/OrbViewer/Main.cc +++ b/src/OrbViewer/Main.cc @@ -130,7 +130,7 @@ Main::OnInit() { //------------------------------------------------------------------------------ AppState::Code Main::OnRunning() { - if (!ImGui::IsMouseHoveringAnyWindow()) { + if (!ImGui::GetIO().WantCaptureMouse) { this->camera.Update(); } this->wireframe.ViewProj = this->camera.ViewProj; From 835ca0ae33c85b61109232deaa8f5652a538cbf9 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Thu, 26 Apr 2018 18:45:27 +0200 Subject: [PATCH 19/24] Fix the MeshViewer sample --- src/Common/CMakeLists.txt | 1 + src/Common/OmshParser.cc | 146 ++++++++++++++++++++++++++++++++++ src/Common/OmshParser.h | 28 +++++++ src/MeshViewer/CMakeLists.txt | 2 +- src/MeshViewer/MeshViewer.cc | 100 +++++++++++++---------- 5 files changed, 233 insertions(+), 44 deletions(-) create mode 100644 src/Common/OmshParser.cc create mode 100644 src/Common/OmshParser.h diff --git a/src/Common/CMakeLists.txt b/src/Common/CMakeLists.txt index 5c51643..8c13ab0 100644 --- a/src/Common/CMakeLists.txt +++ b/src/Common/CMakeLists.txt @@ -6,6 +6,7 @@ fips_begin_lib(Common) OrbFile.h OrbFile.cc OrbLoader.h OrbLoader.cc Wireframe.h Wireframe.cc + OmshParser.h OmshParser.cc ) oryol_shader(wireframe_shaders.glsl) fips_end_lib(Common) diff --git a/src/Common/OmshParser.cc b/src/Common/OmshParser.cc new file mode 100644 index 0000000..3f1637d --- /dev/null +++ b/src/Common/OmshParser.cc @@ -0,0 +1,146 @@ +//------------------------------------------------------------------------------ +// OmshParser.cc +//------------------------------------------------------------------------------ +#include "Pre.h" +#include "OmshParser.h" + +namespace Oryol { + +//------------------------------------------------------------------------------ +OmshParser::Result +OmshParser::Parse(const void* ptr, int size) { + o_assert_dbg(ptr); + o_assert_dbg(size > 4); + Result res; + + // size must be multiple of 4 + if ((size & 3) != 0) { + return res; + } + + const uint32_t* u32StartPtr = (const uint32_t*) ptr; + const uint32_t* u32Ptr = u32StartPtr; + const uint32_t u32Size = size >> 2; + const uint32_t* u32EndPtr = u32StartPtr + u32Size; + + // check if enough data for header + uint32_t u32CheckSize = 7; + if (u32CheckSize > u32Size) { + return res; + } + + // start parsing static header + const uint32_t magic = *u32Ptr++; + if (magic != 'OMSH') { + return res; + } + const uint32_t numVertices = *u32Ptr++; + const uint32_t vertexSize = *u32Ptr++; + const uint32_t numIndices = *u32Ptr++; + const uint32_t indexSize = *u32Ptr++; + const uint32_t numVertexAttrs = *u32Ptr++; + const uint32_t numPrimGroups = *u32Ptr++; + + // check if enough data for vertex components + u32CheckSize += numVertexAttrs * 2; + if (u32CheckSize > u32Size) { + return res; + } + VertexLayout layout; + for (uint32_t i = 0; i < numVertexAttrs; i++) { + const char* attrName = nullptr; + switch (*u32Ptr++) { + case 0: attrName = "position"; break; + case 1: attrName = "normal"; break; + case 2: attrName = "texcoord0"; break; + case 3: attrName = "texcoord1"; break; + case 4: attrName = "texcoord2"; break; + case 5: attrName = "texcoord3"; break; + case 6: attrName = "tangent"; break; + case 7: attrName = "binormal"; break; + case 8: attrName = "weights"; break; + case 9: attrName = "indices"; break; + case 10: attrName = "color0"; break; + case 11: attrName = "color1"; break; + case 12: attrName = "instance0"; break; + case 13: attrName = "instance1"; break; + case 14: attrName = "instance2"; break; + case 15: attrName = "instance3"; break; + } + o_assert(attrName); + VertexFormat::Code attrFmt = VertexFormat::Invalid; + switch (*u32Ptr++) { + case 0: attrFmt = VertexFormat::Float; break; + case 1: attrFmt = VertexFormat::Float2; break; + case 2: attrFmt = VertexFormat::Float3; break; + case 3: attrFmt = VertexFormat::Float4; break; + case 4: attrFmt = VertexFormat::Byte4; break; + case 5: attrFmt = VertexFormat::Byte4N; break; + case 6: attrFmt = VertexFormat::UByte4; break; + case 7: attrFmt = VertexFormat::UByte4N; break; + case 8: attrFmt = VertexFormat::Short2; break; + case 9: attrFmt = VertexFormat::Short2N; break; + case 10: attrFmt = VertexFormat::Short4; break; + case 11: attrFmt = VertexFormat::Short4N; break; + } + o_assert(attrFmt != VertexFormat::Invalid); + layout.Add(attrName, attrFmt); + } + + // check if enough data for primitive groups + u32CheckSize += numPrimGroups * 3; + if (u32CheckSize > u32Size) { + return res; + } + for(uint32_t i = 0; i < numPrimGroups; i++) { + PrimitiveGroup primGroup; + // skip primitive type + u32Ptr++; + primGroup.BaseElement = *u32Ptr++; + primGroup.NumElements = *u32Ptr++; + res.PrimitiveGroups.Add(primGroup); + } + + // check if enough data for vertices + const uint32_t u32VertexDataSize = (numVertices * vertexSize) >> 2; + u32CheckSize += u32VertexDataSize; + if (u32CheckSize > u32Size) { + return res; + } + const void* vertexDataPtr = u32Ptr; + u32Ptr += u32VertexDataSize; + + // check if enough data for indices (index block is padded so that size is multiple of 4) + uint32_t indexDataSize = numIndices * indexSize; + if ((indexDataSize & 3) != 0) { + indexDataSize += 2; + o_assert_dbg((indexDataSize & 3) == 0); + } + const uint32_t u32IndexDataSize = indexDataSize >> 2; + u32CheckSize += u32IndexDataSize; + if (u32CheckSize > u32Size) { + return res; + } + const void* indexDataPtr = u32Ptr; + u32Ptr += u32IndexDataSize; + if (u32Ptr != u32EndPtr) { + return res; + } + + // setup the result + res.Valid = true; + res.VertexBufferDesc = BufferDesc() + .Type(BufferType::VertexBuffer) + .Size(numVertices * vertexSize) + .Content(vertexDataPtr); + res.IndexBufferDesc = BufferDesc() + .Type(BufferType::IndexBuffer) + .Size(numIndices * indexSize) + .Content(indexDataPtr); + res.Layout = layout; + res.IndexType = (indexSize == 2) ? IndexType::UInt16 : IndexType::UInt32; + return res; +} + +} // namespace Oryol + diff --git a/src/Common/OmshParser.h b/src/Common/OmshParser.h new file mode 100644 index 0000000..76b18a2 --- /dev/null +++ b/src/Common/OmshParser.h @@ -0,0 +1,28 @@ +#pragma once +//------------------------------------------------------------------------------ +/** + @class Oryol::OmshParser + @ingroup Assets + @brief parse .omsh file content into gfx resource desc structs +*/ +#include "Gfx/GfxTypes.h" + +namespace Oryol { + +class OmshParser { +public: + /// parsing result + struct Result { + bool Valid = false; + BufferDesc VertexBufferDesc; + BufferDesc IndexBufferDesc; + VertexLayout Layout; + Oryol::IndexType::Code IndexType = IndexType::None; + Array PrimitiveGroups; + }; + /// parse .omsh file content from memory + static Result Parse(const void* ptr, int numBytes); +}; + +} // namespace Oryol + diff --git a/src/MeshViewer/CMakeLists.txt b/src/MeshViewer/CMakeLists.txt index 4d4cc66..a4143e9 100644 --- a/src/MeshViewer/CMakeLists.txt +++ b/src/MeshViewer/CMakeLists.txt @@ -2,6 +2,6 @@ fips_begin_app(MeshViewer windowed) fips_vs_warning_level(3) fips_files(MeshViewer.cc) oryol_shader(shaders.shd) - fips_deps(Gfx Assets HttpFS Input IMUI) + fips_deps(Gfx HttpFS Input IMUI Common) oryol_add_web_sample(MeshViewer "Load and render .omsh mesh files" "emscripten" MeshViewer.jpg "MeshViewer/MeshViewer.cc") fips_end_app() diff --git a/src/MeshViewer/MeshViewer.cc b/src/MeshViewer/MeshViewer.cc index e352db2..ebe7df3 100644 --- a/src/MeshViewer/MeshViewer.cc +++ b/src/MeshViewer/MeshViewer.cc @@ -9,7 +9,7 @@ #include "IMUI/IMUI.h" #include "Input/Input.h" #include "HttpFS/HTTPFileSystem.h" -#include "Assets/Gfx/MeshLoader.h" +#include "Common/OmshParser.h" #include "glm/mat4x4.hpp" #include "glm/gtc/matrix_transform.hpp" #include "glm/gtx/polar_coordinates.hpp" @@ -34,8 +34,11 @@ class MeshViewerApp : public App { int frameCount = 0; ResourceLabel curMeshLabel; - MeshSetup curMeshSetup; - Id mesh; + Id vertexBuffer; + Id indexBuffer; + Array primGroups; + VertexLayout layout; + IndexType::Code indexType = IndexType::None; glm::vec3 eyePos; glm::mat4 view; glm::mat4 proj; @@ -56,13 +59,14 @@ class MeshViewerApp : public App { Id shaders[numShaders]; ResourceLabel curMaterialLabel; int numMaterials = 0; + static constexpr int MaxNumMaterials = 16; struct Material { int shaderIndex = Phong; Id pipeline; glm::vec4 diffuse = glm::vec4(0.0f, 0.24f, 0.64f, 1.0f); glm::vec4 specular = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f); float specPower = 32.0f; - } materials[GfxConfig::MaxNumPrimGroups]; + } materials[MaxNumMaterials]; bool gammaCorrect = true; struct CameraSetting { @@ -114,17 +118,15 @@ const char* MeshViewerApp::shaderNames[numShaders] = { AppState::Code MeshViewerApp::OnInit() { - // setup IO system - IOSetup ioSetup; - ioSetup.FileSystems.Add("http", HTTPFileSystem::Creator()); - ioSetup.Assigns.Add("msh:", ORYOL_SAMPLE_URL); - IO::Setup(ioSetup); - - // setup rendering and input system - auto gfxSetup = GfxSetup::WindowMSAA4(800, 512, "Oryol Mesh Viewer"); - gfxSetup.HighDPI = true; - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); - Gfx::Setup(gfxSetup); + IO::Setup(IODesc() + .FileSystem("http", HTTPFileSystem::Creator()) + .Assign("msh:", ORYOL_SAMPLE_URL)); + Gfx::Setup(GfxDesc() + .Width(800) + .Height(512) + .SampleCount(4) + .HighDPI(true) + .Title("Oryol Mesh Viewer")); Input::Setup(); Input::SetPointerLockHandler([this] (const InputEvent& event) -> PointerLockMode::Code { if (event.Button == MouseButton::Left) { @@ -165,18 +167,17 @@ MeshViewerApp::OnInit() { style.Colors[ImGuiCol_HeaderHovered] = defaultBlue; style.Colors[ImGuiCol_HeaderActive] = defaultBlue; - this->shaders[Normals] = Gfx::CreateResource(NormalsShader::Setup()); - this->shaders[Lambert] = Gfx::CreateResource(LambertShader::Setup()); - this->shaders[Phong] = Gfx::CreateResource(PhongShader::Setup()); + this->shaders[Normals] = Gfx::CreateShader(NormalsShader::Desc()); + this->shaders[Lambert] = Gfx::CreateShader(LambertShader::Desc()); + this->shaders[Phong] = Gfx::CreateShader(PhongShader::Desc()); this->loadMesh(this->meshPaths[this->curMeshIndex]); // setup projection and view matrices - const float fbWidth = (const float) Gfx::DisplayAttrs().FramebufferWidth; - const float fbHeight = (const float) Gfx::DisplayAttrs().FramebufferHeight; + const float fbWidth = (const float) Gfx::DisplayAttrs().Width; + const float fbHeight = (const float) Gfx::DisplayAttrs().Height; this->proj = glm::perspectiveFov(glm::radians(60.0f), fbWidth, fbHeight, 0.01f, 100.0f); - // non-standard camera settings when switching objects - // teapot: + // non-standard camera settings when switching objects to teapot: this->cameraSettings[2].dist = 0.8f; this->cameraSettings[2].height = 0.0f; @@ -192,15 +193,16 @@ MeshViewerApp::OnRunning() { this->updateCamera(); this->updateLight(); - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.5f, 0.5f, 0.5f, 1.0f)); this->drawUI(); DrawState drawState; - drawState.Mesh[0] = this->mesh; + drawState.VertexBuffers[0] = this->vertexBuffer; + drawState.IndexBuffer = this->indexBuffer; for (int i = 0; i < this->numMaterials; i++) { drawState.Pipeline = this->materials[i].pipeline; Gfx::ApplyDrawState(drawState); this->applyVariables(i); - Gfx::Draw(i); + Gfx::Draw(this->primGroups[i]); } ImGui::Render(); Gfx::EndPass(); @@ -288,10 +290,10 @@ MeshViewerApp::updateLight() { void MeshViewerApp::drawUI() { const char* state; - switch (Gfx::QueryResourceInfo(this->mesh).State) { + switch (Gfx::QueryResourceState(this->vertexBuffer)) { case ResourceState::Valid: state = "Loaded"; break; case ResourceState::Failed: state = "Load Failed"; break; - case ResourceState::Pending: state = "Loading..."; break; + case ResourceState::Alloc: state = "Loading..."; break; default: state = "Invalid"; break; } IMUI::NewFrame(); @@ -302,10 +304,10 @@ MeshViewerApp::drawUI() { this->loadMesh(this->meshPaths[this->curMeshIndex]); } ImGui::Text("state: %s\n", state); - if (this->curMeshSetup.NumPrimitiveGroups() > 0) { + if (this->primGroups.Size() > 0) { ImGui::Text("primitive groups:\n"); - for (int i = 0; i < this->curMeshSetup.NumPrimitiveGroups(); i++) { - ImGui::Text("%d: %d triangles\n", i, this->curMeshSetup.PrimitiveGroup(i).NumElements / 3); + for (int i = 0; i < this->primGroups.Size(); i++) { + ImGui::Text("%d: %d triangles\n", i, this->primGroups[i].NumElements / 3); } } if (ImGui::CollapsingHeader("Camera")) { @@ -361,19 +363,20 @@ MeshViewerApp::drawUI() { //----------------------------------------------------------------------------- void MeshViewerApp::createMaterials() { - o_assert_dbg(this->mesh.IsValid()); if (this->curMaterialLabel.IsValid()) { Gfx::DestroyResources(this->curMaterialLabel); } this->curMaterialLabel = Gfx::PushResourceLabel(); for (int i = 0; i < this->numMaterials; i++) { - auto ps = PipelineSetup::FromLayoutAndShader(this->curMeshSetup.Layout, this->shaders[this->materials[i].shaderIndex]); - ps.DepthStencilState.DepthWriteEnabled = true; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - ps.RasterizerState.CullFaceEnabled = true; - ps.RasterizerState.SampleCount = 4; - this->materials[i].pipeline = Gfx::CreateResource(ps); + this->materials[i].pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(this->shaders[this->materials[i].shaderIndex]) + .Layout(0, this->layout) + .IndexType(this->indexType) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true) + .SampleCount(4)); } Gfx::PopResourceLabel(); } @@ -385,19 +388,30 @@ MeshViewerApp::loadMesh(const char* path) { // unload current mesh if (this->curMeshLabel.IsValid()) { Gfx::DestroyResources(this->curMeshLabel); - this->curMeshSetup = MeshSetup(); + this->vertexBuffer.Invalidate(); + this->indexBuffer.Invalidate(); + this->primGroups.Clear(); } // load new mesh, use 'onloaded' callback to capture the mesh setup // object of the loaded mesh this->numMaterials = 0; this->curMeshLabel = Gfx::PushResourceLabel(); - this->mesh = Gfx::LoadResource(MeshLoader::Create(MeshSetup::FromFile(path), [this](MeshSetup& setup) { - this->curMeshSetup = setup; - this->numMaterials = setup.NumPrimitiveGroups(); - this->createMaterials(); - })); + this->vertexBuffer = Gfx::AllocBuffer(Locator::NonShared()); + this->indexBuffer = Gfx::AllocBuffer(Locator::NonShared()); Gfx::PopResourceLabel(); + IO::Load(path, [this](IO::LoadResult res) { + OmshParser::Result omsh = OmshParser::Parse(res.Data.Data(), res.Data.Size()); + if (omsh.Valid) { + Gfx::InitBuffer(this->vertexBuffer, omsh.VertexBufferDesc); + Gfx::InitBuffer(this->indexBuffer, omsh.IndexBufferDesc); + this->layout = omsh.Layout; + this->indexType = omsh.IndexType; + this->primGroups = omsh.PrimitiveGroups; + this->numMaterials = omsh.PrimitiveGroups.Size(); + this->createMaterials(); + } + }); } //----------------------------------------------------------------------------- From dcbdedaf7caea672d3442a22dd3538b4a4e2019a Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Fri, 27 Apr 2018 12:15:07 +0200 Subject: [PATCH 20/24] Fix BulletPhysicsBasic --- src/BulletPhysicsBasic/BulletPhysicsBasic.cc | 20 ++-- src/PhysicsCommon/ShapeRenderer.cc | 115 +++++++++++-------- src/PhysicsCommon/ShapeRenderer.h | 28 +++-- 3 files changed, 93 insertions(+), 70 deletions(-) diff --git a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc index 91f8e7d..eba5def 100644 --- a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc +++ b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc @@ -51,20 +51,18 @@ OryolMain(BulletPhysicsBasicApp); //------------------------------------------------------------------------------ AppState::Code BulletPhysicsBasicApp::OnInit() { - - auto gfxSetup = GfxSetup::WindowMSAA4(800, 600, "BulletPhysicsBasic"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.2f, 0.4f, 0.8f, 1.0f)); - Gfx::Setup(gfxSetup); + auto gfxDesc = GfxDesc().Width(800).Height(600).SampleCount(4).Title("BulletPhysicsBasic"); + Gfx::Setup(gfxDesc); this->colorFSParams.shadowMapSize = glm::vec2(float(this->shapeRenderer.ShadowMapSize)); // instanced shape rendering helper class - this->shapeRenderer.ColorShader = Gfx::CreateResource(ColorShader::Setup()); - this->shapeRenderer.ColorShaderInstanced = Gfx::CreateResource(ColorShaderInstanced::Setup()); - this->shapeRenderer.ShadowShader = Gfx::CreateResource(ShadowShader::Setup()); - this->shapeRenderer.ShadowShaderInstanced = Gfx::CreateResource(ShadowShaderInstanced::Setup()); + this->shapeRenderer.ColorShader = Gfx::CreateShader(ColorShader::Desc()); + this->shapeRenderer.ColorShaderInstanced = Gfx::CreateShader(ColorShaderInstanced::Desc()); + this->shapeRenderer.ShadowShader = Gfx::CreateShader(ShadowShader::Desc()); + this->shapeRenderer.ShadowShaderInstanced = Gfx::CreateShader(ShadowShaderInstanced::Desc()); this->shapeRenderer.SphereRadius = SphereRadius; this->shapeRenderer.BoxSize = BoxSize; - this->shapeRenderer.Setup(gfxSetup); + this->shapeRenderer.Setup(gfxDesc); // setup directional light (for lighting and shadow rendering) glm::mat4 lightView = glm::lookAt(glm::vec3(50.0f, 50.0f, -50.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); @@ -106,12 +104,12 @@ BulletPhysicsBasicApp::OnRunning() { // the shadow pass this->shadowVSParams.mvp = this->lightProjView; - Gfx::BeginPass(this->shapeRenderer.ShadowPass); + Gfx::BeginPass(this->shapeRenderer.ShadowPass, this->shapeRenderer.ShadowPassAction); this->shapeRenderer.DrawShadows(this->shadowVSParams); Gfx::EndPass(); // the color pass - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.4f, 0.8f, 1.0f)); // draw ground const glm::mat4 model = Physics::Transform(this->groundRigidBody); diff --git a/src/PhysicsCommon/ShapeRenderer.cc b/src/PhysicsCommon/ShapeRenderer.cc index 9cbe50b..5179324 100644 --- a/src/PhysicsCommon/ShapeRenderer.cc +++ b/src/PhysicsCommon/ShapeRenderer.cc @@ -10,7 +10,7 @@ namespace Oryol { //------------------------------------------------------------------------------ void -ShapeRenderer::Setup(const GfxSetup& gfxSetup) { +ShapeRenderer::Setup(const GfxDesc& gfxDesc) { o_assert_dbg(this->ColorShader.IsValid()); o_assert_dbg(this->ColorShaderInstanced.IsValid()); o_assert_dbg(this->ShadowShader.IsValid()); @@ -18,15 +18,20 @@ ShapeRenderer::Setup(const GfxSetup& gfxSetup) { // create 2 instance-data buffers, one for the spheres, one for the boxes, // per-instance data is a 4x3 transposed model matrix, and vec4 color - auto instSetup = MeshSetup::Empty(MaxNumInstances, Usage::Stream); - instSetup.Layout + VertexLayout instLayout = VertexLayout() .EnableInstancing() - .Add(VertexAttr::Instance0, VertexFormat::Float4) - .Add(VertexAttr::Instance1, VertexFormat::Float4) - .Add(VertexAttr::Instance2, VertexFormat::Float4) - .Add(VertexAttr::Color0, VertexFormat::Float4); - this->SphereInstMesh = Gfx::CreateResource(instSetup); - this->BoxInstMesh = Gfx::CreateResource(instSetup); + .Add({ + { "instance0", VertexFormat::Float4 }, + { "instance1", VertexFormat::Float4 }, + { "instance2", VertexFormat::Float4 }, + { "color0", VertexFormat::Float4 } + }); + auto instBufDesc = BufferDesc() + .Type(BufferType::VertexBuffer) + .Size(MaxNumInstances * instLayout.ByteSize()) + .Usage(Usage::Stream); + this->SphereInstBuffer = Gfx::CreateBuffer(instBufDesc); + this->BoxInstBuffer = Gfx::CreateBuffer(instBufDesc); // pre-initialize the instance data with random colors for (int i = 0; i < MaxNumInstances; i++) { @@ -37,52 +42,68 @@ ShapeRenderer::Setup(const GfxSetup& gfxSetup) { } // setup a mesh with a sphere and box submesh, which is used by all draw states - ShapeBuilder shapeBuilder; - shapeBuilder.Layout - .Add(VertexAttr::Position, VertexFormat::Float3) - .Add(VertexAttr::Normal, VertexFormat::Byte4N); - shapeBuilder + auto shape = ShapeBuilder() + .Positions("position", VertexFormat::Float3) + .Normals("normal", VertexFormat::Byte4N) .Plane(100, 100, 1) .Sphere(this->SphereRadius, 15, 11) - .Box(this->BoxSize, this->BoxSize, this->BoxSize, 1); - Id shapeMesh = Gfx::CreateResource(shapeBuilder.Build()); - this->ColorDrawState.Mesh[0] = shapeMesh; - this->ColorInstancedDrawState.Mesh[0] = shapeMesh; - this->ShadowDrawState.Mesh[0] = shapeMesh; - this->ShadowInstancedDrawState.Mesh[0] = shapeMesh; + .Box(this->BoxSize, this->BoxSize, this->BoxSize, 1) + .Build(); + this->planePrimGroup = shape.PrimitiveGroups[0]; + this->spherePrimGroup = shape.PrimitiveGroups[1]; + this->boxPrimGroup = shape.PrimitiveGroups[2]; + Id shapeVertexBuffer = Gfx::CreateBuffer(shape.VertexBufferDesc); + Id shapeIndexBuffer = Gfx::CreateBuffer(shape.IndexBufferDesc); + this->ColorDrawState.VertexBuffers[0] = shapeVertexBuffer; + this->ColorInstancedDrawState.VertexBuffers[0] = shapeVertexBuffer; + this->ShadowDrawState.VertexBuffers[0] = shapeVertexBuffer; + this->ShadowInstancedDrawState.VertexBuffers[0] = shapeVertexBuffer; + this->ColorDrawState.IndexBuffer = shapeIndexBuffer; + this->ColorInstancedDrawState.IndexBuffer = shapeIndexBuffer; + this->ShadowDrawState.IndexBuffer = shapeIndexBuffer; + this->ShadowInstancedDrawState.IndexBuffer = shapeIndexBuffer; // create color pass pipeline states (one for non-instanced, one for instanced rendering) - auto ps = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, this->ColorShader); - ps.DepthStencilState.DepthWriteEnabled = true; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - ps.RasterizerState.CullFaceEnabled = true; - ps.RasterizerState.SampleCount = gfxSetup.SampleCount; - this->ColorDrawState.Pipeline = Gfx::CreateResource(ps); - ps.Shader = this->ColorShaderInstanced; - ps.Layouts[1] = instSetup.Layout; - this->ColorInstancedDrawState.Pipeline = Gfx::CreateResource(ps); + auto pipDesc = PipelineDesc(shape.PipelineDesc) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount()); + this->ColorDrawState.Pipeline = Gfx::CreatePipeline(pipDesc.Shader(this->ColorShader)); + this->ColorInstancedDrawState.Pipeline = Gfx::CreatePipeline(pipDesc + .Shader(this->ColorShaderInstanced) + .Layout(1, instLayout)); // create shadow map, use RGBA8 format and encode/decode depth in pixel shader const int smSize = this->ShadowMapSize; - auto smSetup = TextureSetup::RenderTarget2D(smSize, smSize, PixelFormat::RGBA8, PixelFormat::DEPTH); - this->ShadowMap = Gfx::CreateResource(smSetup); - auto smPassSetup = PassSetup::From(this->ShadowMap, this->ShadowMap); - smPassSetup.DefaultAction = PassAction::Clear(glm::vec4(1.0f), 1.0f, 0); - this->ShadowPass = Gfx::CreateResource(smPassSetup); + auto smDesc = TextureDesc() + .RenderTarget(true) + .Type(TextureType::Texture2D) + .Width(smSize) + .Height(smSize); + this->ShadowMap = Gfx::CreateTexture(smDesc.Format(PixelFormat::RGBA8)); this->ColorDrawState.FSTexture[0] = this->ShadowMap; + this->ColorInstancedDrawState.FSTexture[0] = this->ShadowMap; + Id smDepthBuffer = Gfx::CreateTexture(smDesc.Format(PixelFormat::DEPTH)); + this->ShadowPassAction = PassAction().Clear(glm::vec4(1.0), 1.0f, 0); + this->ShadowPass = Gfx::CreatePass(PassDesc() + .ColorAttachment(0, this->ShadowMap) + .DepthStencilAttachment(smDepthBuffer)); // create shadow pass pipeline states (one for non-instanced, one for instanced rendering) - ps = PipelineSetup::FromLayoutAndShader(shapeBuilder.Layout, this->ShadowShader); - ps.DepthStencilState.DepthWriteEnabled = true; - ps.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - ps.RasterizerState.CullFaceEnabled = true; - ps.RasterizerState.SampleCount = 1; - ps.BlendState.ColorFormat = smSetup.ColorFormat; - ps.BlendState.DepthFormat = smSetup.DepthFormat; - this->ShadowDrawState.Pipeline = Gfx::CreateResource(ps); - ps.Shader = this->ShadowShaderInstanced; - ps.Layouts[1] = instSetup.Layout; - this->ShadowInstancedDrawState.Pipeline = Gfx::CreateResource(ps); + pipDesc = PipelineDesc(shape.PipelineDesc) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(true) + .SampleCount(1) + .ColorFormat(PixelFormat::RGBA8) + .DepthFormat(PixelFormat::DEPTH); + this->ShadowDrawState.Pipeline = Gfx::CreatePipeline(pipDesc.Shader(this->ShadowShader)); + this->ShadowInstancedDrawState.Pipeline = Gfx::CreatePipeline(pipDesc + .Shader(this->ShadowShaderInstanced) + .Layout(1, instLayout)); } //------------------------------------------------------------------------------ @@ -96,10 +117,10 @@ ShapeRenderer::BeginTransforms() { void ShapeRenderer::EndTransforms() { if (this->NumSpheres > 0) { - Gfx::UpdateVertices(this->SphereInstMesh, this->SphereInstData, sizeof(instData) * this->NumSpheres); + Gfx::UpdateBuffer(this->SphereInstBuffer, this->SphereInstData, sizeof(instData) * this->NumSpheres); } if (this->NumBoxes > 0) { - Gfx::UpdateVertices(this->BoxInstMesh, this->BoxInstData, sizeof(instData) * this->NumBoxes); + Gfx::UpdateBuffer(this->BoxInstBuffer, this->BoxInstData, sizeof(instData) * this->NumBoxes); } } diff --git a/src/PhysicsCommon/ShapeRenderer.h b/src/PhysicsCommon/ShapeRenderer.h index 5c89292..2193268 100644 --- a/src/PhysicsCommon/ShapeRenderer.h +++ b/src/PhysicsCommon/ShapeRenderer.h @@ -22,7 +22,7 @@ class ShapeRenderer { int ShadowMapSize = 2048; /// setup the shape renderer - void Setup(const GfxSetup& gfxSetup); + void Setup(const GfxDesc& gfxDesc); /// discard the shape renderer void Discard(); /// draw the shadow shapes @@ -43,14 +43,18 @@ class ShapeRenderer { static const int MaxNumInstances = 1024; Id ShadowMap; Id ShadowPass; + PassAction ShadowPassAction; + PrimitiveGroup planePrimGroup; + PrimitiveGroup spherePrimGroup; + PrimitiveGroup boxPrimGroup; DrawState ColorDrawState; DrawState ShadowDrawState; DrawState ColorInstancedDrawState; DrawState ShadowInstancedDrawState; int NumSpheres = 0; int NumBoxes = 0; - Id SphereInstMesh; - Id BoxInstMesh; + Id SphereInstBuffer; + Id BoxInstBuffer; struct instData { glm::vec4 xxxx; glm::vec4 yyyy; @@ -66,16 +70,16 @@ class ShapeRenderer { template inline void ShapeRenderer::DrawShadows(const VSPARAMS& vsParams) { if (this->NumSpheres > 0) { - this->ShadowInstancedDrawState.Mesh[1] = this->SphereInstMesh; + this->ShadowInstancedDrawState.VertexBuffers[1] = this->SphereInstBuffer; Gfx::ApplyDrawState(this->ShadowInstancedDrawState); Gfx::ApplyUniformBlock(vsParams); - Gfx::Draw(1, this->NumSpheres); + Gfx::Draw(this->spherePrimGroup, this->NumSpheres); } if (this->NumBoxes > 0) { - this->ShadowInstancedDrawState.Mesh[1] = this->BoxInstMesh; + this->ShadowInstancedDrawState.VertexBuffers[1] = this->BoxInstBuffer; Gfx::ApplyDrawState(this->ShadowInstancedDrawState); Gfx::ApplyUniformBlock(vsParams); - Gfx::Draw(2, this->NumBoxes); + Gfx::Draw(this->boxPrimGroup, this->NumBoxes); } } @@ -85,25 +89,25 @@ ShapeRenderer::DrawGround(const VSPARAMS& vsParams, const FSPARAMS& fsParams) { Gfx::ApplyDrawState(this->ColorDrawState); Gfx::ApplyUniformBlock(vsParams); Gfx::ApplyUniformBlock(fsParams); - Gfx::Draw(); + Gfx::Draw(this->planePrimGroup); } //------------------------------------------------------------------------------ template void ShapeRenderer::DrawShapes(const VSPARAMS& vsParams, const FSPARAMS& fsParams) { if (this->NumSpheres > 0) { - this->ColorInstancedDrawState.Mesh[1] = this->SphereInstMesh; + this->ColorInstancedDrawState.VertexBuffers[1] = this->SphereInstBuffer; Gfx::ApplyDrawState(this->ColorInstancedDrawState); Gfx::ApplyUniformBlock(vsParams); Gfx::ApplyUniformBlock(fsParams); - Gfx::Draw(1, this->NumSpheres); + Gfx::Draw(this->spherePrimGroup, this->NumSpheres); } if (this->NumBoxes > 0) { - this->ColorInstancedDrawState.Mesh[1] = this->BoxInstMesh; + this->ColorInstancedDrawState.VertexBuffers[1] = this->BoxInstBuffer; Gfx::ApplyDrawState(this->ColorInstancedDrawState); Gfx::ApplyUniformBlock(vsParams); Gfx::ApplyUniformBlock(fsParams); - Gfx::Draw(2, this->NumBoxes); + Gfx::Draw(this->boxPrimGroup, this->NumBoxes); } } From ebe7e35d92f1c37d7c073038e35aefca68b58305 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Fri, 27 Apr 2018 22:43:43 +0200 Subject: [PATCH 21/24] Fix BulletPhysicsCloth sample --- src/BulletPhysicsBasic/BulletPhysicsBasic.cc | 4 +- src/BulletPhysicsCloth/BulletPhysicsCloth.cc | 80 ++++++++++---------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc index eba5def..39828fd 100644 --- a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc +++ b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc @@ -78,7 +78,7 @@ BulletPhysicsBasicApp::OnInit() { this->colorFSParams.lightDir = glm::vec3(glm::column(glm::inverse(lightView), 2)); Input::Setup(); - Dbg::Setup(); + Dbg::Setup(DbgDesc().SampleCount(4)); this->camera.Setup(); // setup the initial physics world @@ -103,8 +103,8 @@ BulletPhysicsBasicApp::OnRunning() { this->camera.Update(); // the shadow pass - this->shadowVSParams.mvp = this->lightProjView; Gfx::BeginPass(this->shapeRenderer.ShadowPass, this->shapeRenderer.ShadowPassAction); + this->shadowVSParams.mvp = this->lightProjView; this->shapeRenderer.DrawShadows(this->shadowVSParams); Gfx::EndPass(); diff --git a/src/BulletPhysicsCloth/BulletPhysicsCloth.cc b/src/BulletPhysicsCloth/BulletPhysicsCloth.cc index 1efd34b..74a0999 100644 --- a/src/BulletPhysicsCloth/BulletPhysicsCloth.cc +++ b/src/BulletPhysicsCloth/BulletPhysicsCloth.cc @@ -39,7 +39,7 @@ class BulletPhysicsClothApp : public App { TimePoint lapTimePoint; CameraHelper camera; ShapeRenderer shapeRenderer; - Id clothMesh; + Id clothVertexBuffer; DrawState clothColorDrawState; DrawState clothShadowDrawState; ColorShader::vsParams colorVSParams; @@ -66,49 +66,53 @@ OryolMain(BulletPhysicsClothApp); //------------------------------------------------------------------------------ AppState::Code BulletPhysicsClothApp::OnInit() { - auto gfxSetup = GfxSetup::WindowMSAA4(800, 600, "BulletPhysicsCloth"); - gfxSetup.DefaultPassAction = PassAction::Clear(glm::vec4(0.2f, 0.4f, 0.8f, 1.0f)); - Gfx::Setup(gfxSetup); + auto gfxDesc = GfxDesc().Width(800).Height(600).SampleCount(4).Title("BulletPhysicsCloth"); + Gfx::Setup(gfxDesc); this->colorFSParams.shadowMapSize = glm::vec2(float(this->shapeRenderer.ShadowMapSize)); // instanced shape rendering helper class - const Id colorShader = Gfx::CreateResource(ColorShader::Setup()); - const Id shadowShader = Gfx::CreateResource(ShadowShader::Setup()); + const Id colorShader = Gfx::CreateShader(ColorShader::Desc()); + const Id shadowShader = Gfx::CreateShader(ShadowShader::Desc()); this->shapeRenderer.ColorShader = colorShader; - this->shapeRenderer.ColorShaderInstanced = Gfx::CreateResource(ColorShaderInstanced::Setup()); + this->shapeRenderer.ColorShaderInstanced = Gfx::CreateShader(ColorShaderInstanced::Desc()); this->shapeRenderer.ShadowShader = shadowShader; - this->shapeRenderer.ShadowShaderInstanced = Gfx::CreateResource(ShadowShaderInstanced::Setup()); + this->shapeRenderer.ShadowShaderInstanced = Gfx::CreateShader(ShadowShaderInstanced::Desc()); this->shapeRenderer.SphereRadius = SphereRadius; this->shapeRenderer.BoxSize = BoxSize; - this->shapeRenderer.Setup(gfxSetup); + this->shapeRenderer.Setup(gfxDesc); + this->clothColorDrawState.FSTexture[0] = this->shapeRenderer.ShadowMap; // setup a mesh with dynamic vertex buffer and no indices // FIXME: use index rendering later - auto meshSetup = MeshSetup::Empty(NumClothVertices, Usage::Stream); - meshSetup.Layout - .Add(VertexAttr::Position, VertexFormat::Float3) - .Add(VertexAttr::Normal, VertexFormat::Float3); - meshSetup.AddPrimitiveGroup(PrimitiveGroup(0, NumClothTriangles*3)); - this->clothMesh = Gfx::CreateResource(meshSetup); - this->clothColorDrawState.Mesh[0] = this->clothMesh; - this->clothShadowDrawState.Mesh[0] = this->clothMesh; + VertexLayout layout = { + { "position", VertexFormat::Float3 }, + { "normal", VertexFormat::Float3 } + }; + this->clothVertexBuffer = Gfx::CreateBuffer(BufferDesc() + .Size(NumClothVertices * layout.ByteSize()) + .Usage(Usage::Stream)); + this->clothColorDrawState.VertexBuffers[0] = this->clothVertexBuffer; + this->clothShadowDrawState.VertexBuffers[0] = this->clothVertexBuffer; // setup pipeline states (color and shadow pass) for cloth rendering - auto pipSetup = PipelineSetup::FromLayoutAndShader(meshSetup.Layout, colorShader); - pipSetup.DepthStencilState.DepthWriteEnabled = true; - pipSetup.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pipSetup.RasterizerState.CullFaceEnabled = false; - pipSetup.RasterizerState.SampleCount = gfxSetup.SampleCount; - this->clothColorDrawState.Pipeline = Gfx::CreateResource(pipSetup); - - pipSetup = PipelineSetup::FromLayoutAndShader(meshSetup.Layout, shadowShader); - pipSetup.DepthStencilState.DepthWriteEnabled = true; - pipSetup.DepthStencilState.DepthCmpFunc = CompareFunc::LessEqual; - pipSetup.RasterizerState.CullFaceEnabled = false; - pipSetup.RasterizerState.SampleCount = 1; - pipSetup.BlendState.ColorFormat = PixelFormat::RGBA8; - pipSetup.BlendState.DepthFormat = PixelFormat::DEPTH; - this->clothShadowDrawState.Pipeline = Gfx::CreateResource(pipSetup); + this->clothColorDrawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(colorShader) + .Layout(0, layout) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(false) + .ColorFormat(gfxDesc.ColorFormat()) + .DepthFormat(gfxDesc.DepthFormat()) + .SampleCount(gfxDesc.SampleCount())); + this->clothShadowDrawState.Pipeline = Gfx::CreatePipeline(PipelineDesc() + .Shader(shadowShader) + .Layout(0, layout) + .DepthWriteEnabled(true) + .DepthCmpFunc(CompareFunc::LessEqual) + .CullFaceEnabled(false) + .ColorFormat(PixelFormat::RGBA8) + .DepthFormat(PixelFormat::DEPTH) + .SampleCount(1)); // setup directional light (for lighting and shadow rendering) glm::mat4 lightView = glm::lookAt(glm::vec3(50.0f, 50.0f, -50.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); @@ -144,7 +148,7 @@ BulletPhysicsClothApp::OnInit() { Physics::Add(this->clothSoftBody); Input::Setup(); - Dbg::Setup(); + Dbg::Setup(DbgDesc().SampleCount(4)); this->camera.Setup(); camera.Orbital = glm::vec2(glm::radians(40.0f), glm::radians(180.0f)); camera.Center = glm::vec3(0.0f, 7.0f, 0.0f); @@ -165,16 +169,16 @@ BulletPhysicsClothApp::OnRunning() { } // the shadow pass - Gfx::BeginPass(this->shapeRenderer.ShadowPass); + Gfx::BeginPass(this->shapeRenderer.ShadowPass, this->shapeRenderer.ShadowPassAction); this->shadowVSParams.mvp = this->lightProjView; this->shapeRenderer.DrawShadows(this->shadowVSParams); Gfx::ApplyDrawState(this->clothShadowDrawState); Gfx::ApplyUniformBlock(this->shadowVSParams); - Gfx::Draw(); + Gfx::Draw(0, NumClothTriangles * 3); Gfx::EndPass(); // begin color pass rendering - Gfx::BeginPass(); + Gfx::BeginPass(PassAction().Clear(0.2f, 0.4f, 0.8f, 1.0f)); // draw ground const glm::mat4 model = Physics::Transform(this->groundRigidBody); @@ -199,7 +203,7 @@ BulletPhysicsClothApp::OnRunning() { Gfx::ApplyDrawState(this->clothColorDrawState); Gfx::ApplyUniformBlock(this->colorVSParams); Gfx::ApplyUniformBlock(this->colorFSParams); - Gfx::Draw(); + Gfx::Draw(0, NumClothTriangles * 3); Dbg::PrintF("\n\r" " Mouse left click + drag: rotate camera\n\r" @@ -317,6 +321,6 @@ BulletPhysicsClothApp::updateClothData() { } } } - Gfx::UpdateVertices(this->clothMesh, this->clothVertices, sizeof(this->clothVertices)); + Gfx::UpdateBuffer(this->clothVertexBuffer, this->clothVertices, sizeof(this->clothVertices)); return Clock::Since(startTime); } From 520c5300c640d295ce183293f529b207de9ac630 Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Wed, 2 May 2018 10:27:05 +0200 Subject: [PATCH 22/24] Fixes for WebGL1 restrictions in Fractal and Paclone --- src/Fractal/Fractal.cc | 4 +++- src/Paclone/Paclone.cc | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Fractal/Fractal.cc b/src/Fractal/Fractal.cc index d73a1e8..76214e8 100644 --- a/src/Fractal/Fractal.cc +++ b/src/Fractal/Fractal.cc @@ -364,7 +364,9 @@ FractalApp::recreateRenderTargets(const DisplayAttrs& attrs) { .Height(attrs.Height) .Format(PixelFormat::RGBA32F) .MinFilter(TextureFilterMode::Nearest) - .MagFilter(TextureFilterMode::Nearest); + .MagFilter(TextureFilterMode::Nearest) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge); for (int i = 0; i < 2; i++) { this->offscreenRenderTarget[i] = Gfx::CreateTexture(offscreenRTDesc); this->offscreenPass[i] = Gfx::CreatePass(PassDesc() diff --git a/src/Paclone/Paclone.cc b/src/Paclone/Paclone.cc index 453f1ea..9eecc4d 100644 --- a/src/Paclone/Paclone.cc +++ b/src/Paclone/Paclone.cc @@ -69,7 +69,9 @@ PacloneApp::OnInit() { .Width(canvasWidth) .Height(canvasHeight) .MinFilter(TextureFilterMode::Linear) - .MagFilter(TextureFilterMode::Linear)); + .MagFilter(TextureFilterMode::Linear) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge)); this->canvasPass = Gfx::CreatePass(PassDesc() .ColorAttachment(0, this->canvasDrawState.FSTexture[0])); From 5dcbf8600220b806bfd45e12a5f2a8808e8cad9f Mon Sep 17 00:00:00 2001 From: Andre Weissflog Date: Thu, 10 May 2018 20:34:13 +0200 Subject: [PATCH 23/24] modernize samples webpage --- fips-verbs/webpage.py | 2 +- src/BulletPhysicsBasic/BulletPhysicsBasic.cc | 8 +- src/BulletPhysicsCloth/BulletPhysicsCloth.cc | 8 +- src/Common/CameraHelper.cc | 4 +- src/Dragons/Dragons.cc | 8 +- src/DrawCallExplorer/DrawCallExplorer.cc | 21 +- src/Fractal/Fractal.cc | 13 +- src/ImGuiDemo/ImGuiDemo.cc | 5 +- src/KC85-3/Main.cc | 6 +- src/MeshViewer/MeshViewer.cc | 20 +- src/NuklearUIAdvanced/NuklearUIAdvanced.cc | 5 +- src/NuklearUIBasic/NuklearUIBasic.cc | 5 +- src/OrbViewer/Main.cc | 5 +- src/Paclone/Paclone.cc | 13 +- src/SoloudMOD/SoloudMOD.cc | 7 +- src/SoloudTedSid/SoloudTedSid.cc | 9 +- src/SoundTest/SoundTest.cc | 9 +- src/StbVoxelDemo/Main.cc | 5 +- src/TurboBadgerDemo/TurboBadgerDemo.cc | 7 +- web/about.html | 38 ---- web/emsc.html | 24 +-- web/emsc.js | 18 +- web/index.html | 20 +- web/style.css | 193 +++++-------------- web/wasm.html | 39 +--- web/wasm.js | 63 ------ 26 files changed, 169 insertions(+), 386 deletions(-) delete mode 100644 web/about.html delete mode 100644 web/wasm.js diff --git a/fips-verbs/webpage.py b/fips-verbs/webpage.py index ca98e1b..5351600 100644 --- a/fips-verbs/webpage.py +++ b/fips-verbs/webpage.py @@ -72,7 +72,7 @@ def deploy_webpage(fips_dir, proj_dir, webpage_dir) : f.write(html) # copy other required files - for name in ['style.css', 'dummy.jpg', 'emsc.js', 'wasm.js', 'about.html', 'favicon.png', 'core_samples.jpg'] : + for name in ['style.css', 'dummy.jpg', 'emsc.js', 'favicon.png', 'core_samples.jpg'] : log.info('> copy file: {}'.format(name)) shutil.copy(proj_dir + '/web/' + name, webpage_dir + '/' + name) diff --git a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc index 39828fd..441f78d 100644 --- a/src/BulletPhysicsBasic/BulletPhysicsBasic.cc +++ b/src/BulletPhysicsBasic/BulletPhysicsBasic.cc @@ -51,7 +51,11 @@ OryolMain(BulletPhysicsBasicApp); //------------------------------------------------------------------------------ AppState::Code BulletPhysicsBasicApp::OnInit() { - auto gfxDesc = GfxDesc().Width(800).Height(600).SampleCount(4).Title("BulletPhysicsBasic"); + auto gfxDesc = GfxDesc() + .Width(800).Height(600) + .SampleCount(4) + .Title("BulletPhysicsBasic") + .HtmlTrackElementSize(true); Gfx::Setup(gfxDesc); this->colorFSParams.shadowMapSize = glm::vec2(float(this->shapeRenderer.ShadowMapSize)); @@ -127,7 +131,7 @@ BulletPhysicsBasicApp::OnRunning() { this->colorVSParams.diffColor = glm::vec3(1.0f, 1.0f, 1.0f); this->shapeRenderer.DrawShapes(this->colorVSParams, this->colorFSParams); - Dbg::PrintF("\n\r" + Dbg::PrintF("\n\n\n\n\n\r" " Mouse left click + drag: rotate camera\n\r" " Mouse wheel: zoom camera\n\r" " P: pause/continue\n\n\r" diff --git a/src/BulletPhysicsCloth/BulletPhysicsCloth.cc b/src/BulletPhysicsCloth/BulletPhysicsCloth.cc index 74a0999..d39bb4f 100644 --- a/src/BulletPhysicsCloth/BulletPhysicsCloth.cc +++ b/src/BulletPhysicsCloth/BulletPhysicsCloth.cc @@ -66,7 +66,11 @@ OryolMain(BulletPhysicsClothApp); //------------------------------------------------------------------------------ AppState::Code BulletPhysicsClothApp::OnInit() { - auto gfxDesc = GfxDesc().Width(800).Height(600).SampleCount(4).Title("BulletPhysicsCloth"); + auto gfxDesc = GfxDesc() + .Width(800).Height(600) + .SampleCount(4) + .Title("BulletPhysicsCloth") + .HtmlTrackElementSize(true); Gfx::Setup(gfxDesc); this->colorFSParams.shadowMapSize = glm::vec2(float(this->shapeRenderer.ShadowMapSize)); @@ -205,7 +209,7 @@ BulletPhysicsClothApp::OnRunning() { Gfx::ApplyUniformBlock(this->colorFSParams); Gfx::Draw(0, NumClothTriangles * 3); - Dbg::PrintF("\n\r" + Dbg::PrintF("\n\n\n\n\n\r" " Mouse left click + drag: rotate camera\n\r" " Mouse wheel: zoom camera\n\r" " P: pause/continue\n\r" diff --git a/src/Common/CameraHelper.cc b/src/Common/CameraHelper.cc index ba85380..7466d3e 100644 --- a/src/Common/CameraHelper.cc +++ b/src/Common/CameraHelper.cc @@ -80,8 +80,8 @@ CameraHelper::HandleInput() { void CameraHelper::UpdateTransforms() { // recompute projection matrix if framebuffer size has changed - int w = Gfx::DisplayAttrs().Width; - int h = Gfx::DisplayAttrs().Height; + int w = Gfx::Width(); + int h = Gfx::Height(); if ((w != this->fbWidth) || (h != this->fbHeight)) { this->fbWidth = w; this->fbHeight = h; diff --git a/src/Dragons/Dragons.cc b/src/Dragons/Dragons.cc index 8f5a22b..5587c4f 100644 --- a/src/Dragons/Dragons.cc +++ b/src/Dragons/Dragons.cc @@ -74,7 +74,11 @@ Dragons::OnInit() { .Assign("orb:", ORYOL_SAMPLE_URL) .FileSystem("http", HTTPFileSystem::Creator())); - this->gfxDesc = GfxDesc().Width(1024).Height(640).SampleCount(4).Title("Dragons"); + this->gfxDesc = GfxDesc() + .Width(1024).Height(640) + .SampleCount(4) + .Title("Dragons") + .HtmlTrackElementSize(true); Gfx::Setup(this->gfxDesc); AnimSetup animSetup; animSetup.MaxNumInstances = MaxNumInstances; @@ -295,7 +299,7 @@ Dragons::updateNumInstances() { void Dragons::drawUI() { if (this->orbModel.IsValid) { - ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(10, 40), ImGuiSetCond_Once); if (ImGui::Begin("Dragons", nullptr)) { const int numBonesPerInst = Anim::Skeleton(this->orbModel.Skeleton).NumBones; const int numTrisPerInst = this->orbModel.Submeshes[0].PrimGroup.NumElements / 3; diff --git a/src/DrawCallExplorer/DrawCallExplorer.cc b/src/DrawCallExplorer/DrawCallExplorer.cc index fa4f6b1..0632a38 100644 --- a/src/DrawCallExplorer/DrawCallExplorer.cc +++ b/src/DrawCallExplorer/DrawCallExplorer.cc @@ -38,10 +38,6 @@ class DrawCallExplorerApp : public App { PrimitiveGroup primGroup; StaticArray pipelines; - glm::mat4 view; - glm::mat4 proj; - glm::mat4 model; - // FIXME: hmm these param blocks are actually compatibel across shaders RedShader::perFrameParams perFrameParams; RedShader::perParticleParams perParticleParams; @@ -144,8 +140,9 @@ void DrawCallExplorerApp::updateCamera() { float angle = this->frameCount * 0.01f; glm::vec3 pos(glm::sin(angle) * 10.0f, 2.5f, glm::cos(angle) * 10.0f); - this->view = glm::lookAt(pos, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); - this->perFrameParams.mvp = this->proj * this->view * this->model; + glm::mat4 proj = glm::perspectiveFov(glm::radians(45.0f), float(Gfx::Width()), float(Gfx::Height()), 0.01f, 100.0f); + glm::mat4 view = glm::lookAt(pos, glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); + this->perFrameParams.mvp = proj * view; } //------------------------------------------------------------------------------ @@ -198,7 +195,8 @@ DrawCallExplorerApp::OnInit() { .Width(620) .Height(500) .Title("Oryol DrawCallExplorer") - .GlobalUniformBufferSize(1024 * 1024 * 32)); + .GlobalUniformBufferSize(1024 * 1024 * 32) + .HtmlTrackElementSize(true)); Input::Setup(); IMUI::Setup(); @@ -227,13 +225,6 @@ DrawCallExplorerApp::OnInit() { this->pipelines[1] = Gfx::CreatePipeline(psDesc.Shader(greenShd)); this->pipelines[2] = Gfx::CreatePipeline(psDesc.Shader(blueShd)); - // setup projection and view matrices - const float fbWidth = (const float) Gfx::DisplayAttrs().Width; - const float fbHeight = (const float) Gfx::DisplayAttrs().Height; - this->proj = glm::perspectiveFov(glm::radians(45.0f), fbWidth, fbHeight, 0.01f, 100.0f); - this->view = glm::lookAt(glm::vec3(0.0f, 2.5f, 0.0f), glm::vec3(0.0f, 0.0f, -10.0f), glm::vec3(0.0f, 1.0f, 0.0f)); - this->model = glm::mat4(); - this->lastFrameTimePoint = Clock::Now(); return App::OnInit(); @@ -252,7 +243,7 @@ DrawCallExplorerApp::OnCleanup() { void DrawCallExplorerApp::drawUI() { IMUI::NewFrame(); - ImGui::SetNextWindowPos(ImVec2(10, 10), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(10, 40), ImGuiSetCond_Once); ImGui::SetNextWindowSize(ImVec2(250, 160), ImGuiSetCond_Once); if (ImGui::Begin("Controls")) { if (ImGui::Button("Reset")) { diff --git a/src/Fractal/Fractal.cc b/src/Fractal/Fractal.cc index 76214e8..fd7c272 100644 --- a/src/Fractal/Fractal.cc +++ b/src/Fractal/Fractal.cc @@ -120,7 +120,10 @@ FractalApp::OnRunning() { //------------------------------------------------------------------------------ AppState::Code FractalApp::OnInit() { - Gfx::Setup(GfxDesc().Width(800).Height(512).Title("Fractal Sample")); + Gfx::Setup(GfxDesc() + .Width(800).Height(512) + .Title("Fractal Sample") + .HtmlTrackElementSize(true)); Gfx::Subscribe([this](const GfxEvent& event) { if (event.Type == GfxEvent::DisplayModified) { this->recreateRenderTargets(event.DisplayAttrs); @@ -197,7 +200,7 @@ FractalApp::drawUI() { IMUI::NewFrame(); // draw the controls window - ImGui::SetNextWindowPos(ImVec2(5, 5), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(5, 50), ImGuiSetCond_Once); ImGui::Begin("Controls", nullptr, ImVec2(300, 230)); ImGui::BulletText("mouse-drag a rectangle to zoom in"); ImGui::BulletText("click into Mandelbrot to render\nJulia set at that point"); @@ -364,9 +367,9 @@ FractalApp::recreateRenderTargets(const DisplayAttrs& attrs) { .Height(attrs.Height) .Format(PixelFormat::RGBA32F) .MinFilter(TextureFilterMode::Nearest) - .MagFilter(TextureFilterMode::Nearest) - .WrapU(TextureWrapMode::ClampToEdge) - .WrapV(TextureWrapMode::ClampToEdge); + .MagFilter(TextureFilterMode::Nearest) + .WrapU(TextureWrapMode::ClampToEdge) + .WrapV(TextureWrapMode::ClampToEdge); for (int i = 0; i < 2; i++) { this->offscreenRenderTarget[i] = Gfx::CreateTexture(offscreenRTDesc); this->offscreenPass[i] = Gfx::CreatePass(PassDesc() diff --git a/src/ImGuiDemo/ImGuiDemo.cc b/src/ImGuiDemo/ImGuiDemo.cc index 6b0968a..cb40164 100644 --- a/src/ImGuiDemo/ImGuiDemo.cc +++ b/src/ImGuiDemo/ImGuiDemo.cc @@ -30,7 +30,10 @@ OryolMain(ImGuiDemoApp); //------------------------------------------------------------------------------ AppState::Code ImGuiDemoApp::OnInit() { - Gfx::Setup(GfxDesc().Width(1024).Height(700).Title("Oryol ImGui Demo")); + Gfx::Setup(GfxDesc() + .Width(1024).Height(700) + .Title("Oryol ImGui Demo") + .HtmlTrackElementSize(true)); Input::Setup(); IMUI::Setup(); this->lastTimePoint = Clock::Now(); diff --git a/src/KC85-3/Main.cc b/src/KC85-3/Main.cc index c82d23e..0ca2bbc 100644 --- a/src/KC85-3/Main.cc +++ b/src/KC85-3/Main.cc @@ -60,7 +60,11 @@ KC853App::OnInit() { IO::Setup(IODesc() .Assign("kcc:", ORYOL_SAMPLE_URL) .FileSystem("http", HTTPFileSystem::Creator())); - auto gfxDesc = GfxDesc().Width(800).Height(512).SampleCount(4).Title("Emu"); + auto gfxDesc = GfxDesc() + .Width(800).Height(512) + .SampleCount(4) + .Title("Emu") + .HtmlTrackElementSize(true); Gfx::Setup(gfxDesc); Input::Setup(); Dbg::Setup(DbgDesc().SampleCount(4)); diff --git a/src/MeshViewer/MeshViewer.cc b/src/MeshViewer/MeshViewer.cc index ebe7df3..c90eb57 100644 --- a/src/MeshViewer/MeshViewer.cc +++ b/src/MeshViewer/MeshViewer.cc @@ -40,9 +40,6 @@ class MeshViewerApp : public App { VertexLayout layout; IndexType::Code indexType = IndexType::None; glm::vec3 eyePos; - glm::mat4 view; - glm::mat4 proj; - glm::mat4 model; glm::mat4 modelViewProj; int curMeshIndex = 0; @@ -126,7 +123,8 @@ MeshViewerApp::OnInit() { .Height(512) .SampleCount(4) .HighDPI(true) - .Title("Oryol Mesh Viewer")); + .Title("Oryol Mesh Viewer") + .HtmlTrackElementSize(true)); Input::Setup(); Input::SetPointerLockHandler([this] (const InputEvent& event) -> PointerLockMode::Code { if (event.Button == MouseButton::Left) { @@ -172,11 +170,6 @@ MeshViewerApp::OnInit() { this->shaders[Phong] = Gfx::CreateShader(PhongShader::Desc()); this->loadMesh(this->meshPaths[this->curMeshIndex]); - // setup projection and view matrices - const float fbWidth = (const float) Gfx::DisplayAttrs().Width; - const float fbHeight = (const float) Gfx::DisplayAttrs().Height; - this->proj = glm::perspectiveFov(glm::radians(60.0f), fbWidth, fbHeight, 0.01f, 100.0f); - // non-standard camera settings when switching objects to teapot: this->cameraSettings[2].dist = 0.8f; this->cameraSettings[2].height = 0.0f; @@ -270,8 +263,9 @@ MeshViewerApp::updateCamera() { } this->eyePos = glm::euclidean(this->camera.orbital) * this->camera.dist; glm::vec3 poi = glm::vec3(0.0f, this->camera.height, 0.0f); - this->view = glm::lookAt(this->eyePos + poi, poi, glm::vec3(0.0f, 1.0f, 0.0f)); - this->modelViewProj = this->proj * this->view; + glm::mat4 proj = glm::perspectiveFov(glm::radians(60.0f), float(Gfx::Width()), float(Gfx::Height()), 0.01f, 100.0f); + glm::mat4 view = glm::lookAt(this->eyePos + poi, poi, glm::vec3(0.0f, 1.0f, 0.0f)); + this->modelViewProj = proj * view; } //----------------------------------------------------------------------------- @@ -431,7 +425,7 @@ MeshViewerApp::applyVariables(int matIndex) { { LambertShader::vsParams vsParams; vsParams.mvp = this->modelViewProj; - vsParams.model = this->model; + vsParams.model = glm::mat4(1.0f); Gfx::ApplyUniformBlock(vsParams); LambertShader::fsParams fsParams; @@ -447,7 +441,7 @@ MeshViewerApp::applyVariables(int matIndex) { { PhongShader::vsParams vsParams; vsParams.mvp = this->modelViewProj; - vsParams.model = this->model; + vsParams.model = glm::mat4(1.0f); Gfx::ApplyUniformBlock(vsParams); PhongShader::fsParams fsParams; diff --git a/src/NuklearUIAdvanced/NuklearUIAdvanced.cc b/src/NuklearUIAdvanced/NuklearUIAdvanced.cc index 5de3c66..2a7de71 100644 --- a/src/NuklearUIAdvanced/NuklearUIAdvanced.cc +++ b/src/NuklearUIAdvanced/NuklearUIAdvanced.cc @@ -101,7 +101,10 @@ DemoApp::OnInit() { IO::Setup(IODesc() .Assign("data:", ORYOL_SAMPLE_URL "nkui/") .FileSystem("http", HTTPFileSystem::Creator())); - Gfx::Setup(GfxDesc().Width(1027).Height(700).Title("Advanced Nuklear UI Demo")); + Gfx::Setup(GfxDesc() + .Width(1027).Height(700) + .Title("Advanced Nuklear UI Demo") + .HtmlTrackElementSize(true)); Input::Setup(); NKUI::Setup(); Memory::Clear(&media, sizeof(media)); diff --git a/src/NuklearUIBasic/NuklearUIBasic.cc b/src/NuklearUIBasic/NuklearUIBasic.cc index 8a28678..5a4f979 100644 --- a/src/NuklearUIBasic/NuklearUIBasic.cc +++ b/src/NuklearUIBasic/NuklearUIBasic.cc @@ -29,7 +29,10 @@ OryolMain(DemoApp); //------------------------------------------------------------------------------ AppState::Code DemoApp::OnInit() { - Gfx::Setup(GfxDesc().Width(1024).Height(700).Title("Basic Nuklear UI Demo")); + Gfx::Setup(GfxDesc() + .Width(1024).Height(700) + .Title("Basic Nuklear UI Demo") + .HtmlTrackElementSize(true)); Input::Setup(); NKUI::Setup(); return AppState::Running; diff --git a/src/OrbViewer/Main.cc b/src/OrbViewer/Main.cc index 7c91d15..11fd226 100644 --- a/src/OrbViewer/Main.cc +++ b/src/OrbViewer/Main.cc @@ -82,7 +82,8 @@ Main::OnInit() { .Width(1024) .Height(640) .SampleCount(4) - .Title("Orb File Viewer"); + .Title("Orb File Viewer") + .HtmlTrackElementSize(true); Gfx::Setup(this->gfxDesc); AnimSetup animSetup; animSetup.SkinMatrixTableWidth = BoneTextureWidth; @@ -228,7 +229,7 @@ Main::drawUI() { //------------------------------------------------------------------------------ void Main::drawMainWindow() { - ImGui::SetNextWindowPos(ImVec2(5, 5), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(5, 40), ImGuiSetCond_Once); if (ImGui::Begin("##main_window", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { ImGui::Checkbox("freeze time", &this->ui.freezeTime); ImGui::SliderFloat("time scale", &this->ui.timeScale, 0.001f, 2.0f); diff --git a/src/Paclone/Paclone.cc b/src/Paclone/Paclone.cc index 9eecc4d..9abee5a 100644 --- a/src/Paclone/Paclone.cc +++ b/src/Paclone/Paclone.cc @@ -57,7 +57,10 @@ AppState::Code PacloneApp::OnInit() { this->tick = 0; - Gfx::Setup(GfxDesc().Width(dispWidth).Height(dispHeight).Title("Oryol Pacman Clone Sample")); + Gfx::Setup(GfxDesc() + .Width(dispWidth).Height(dispHeight) + .Title("Oryol Pacman Clone Sample") + .HtmlTrackElementSize(true)); Input::Setup(); Sound::Setup(SoundSetup()); Dbg::Setup(DbgDesc().DepthFormat(PixelFormat::None)); @@ -69,8 +72,8 @@ PacloneApp::OnInit() { .Width(canvasWidth) .Height(canvasHeight) .MinFilter(TextureFilterMode::Linear) - .MagFilter(TextureFilterMode::Linear) - .WrapU(TextureWrapMode::ClampToEdge) + .MagFilter(TextureFilterMode::Linear) + .WrapU(TextureWrapMode::ClampToEdge) .WrapV(TextureWrapMode::ClampToEdge)); this->canvasPass = Gfx::CreatePass(PassDesc() .ColorAttachment(0, this->canvasDrawState.FSTexture[0])); @@ -98,8 +101,8 @@ PacloneApp::OnInit() { void PacloneApp::applyViewPort() { float aspect = float(Width) / float(Height); - const int fbWidth = Gfx::DisplayAttrs().Width; - const int fbHeight = Gfx::DisplayAttrs().Height; + const int fbWidth = Gfx::Width(); + const int fbHeight = Gfx::Height(); this->viewPortY = 0; this->viewPortH = fbHeight; this->viewPortW = (const int) (fbHeight * aspect); diff --git a/src/SoloudMOD/SoloudMOD.cc b/src/SoloudMOD/SoloudMOD.cc index 5d9854f..fe6b04c 100644 --- a/src/SoloudMOD/SoloudMOD.cc +++ b/src/SoloudMOD/SoloudMOD.cc @@ -52,7 +52,7 @@ SoloudMODApp::OnRunning() { float* buf = this->soloud.getWave(); float* fft = this->soloud.calcFFT(); - ImGui::SetNextWindowPos(ImVec2(20, 20), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(20, 40), ImGuiSetCond_Once); ImGui::Begin("MOD Player (MODs from SoLoud and modarchive.org)", nullptr, ImVec2(660, 400)); for (int i = 0; i < NumMods; i++) { ImGui::PushID(i); @@ -106,7 +106,10 @@ SoloudMODApp::OnInit() { IO::Setup(IODesc() .Assign("snd:", ORYOL_SAMPLE_URL) .FileSystem("http", HTTPFileSystem::Creator())); - Gfx::Setup(GfxDesc().Width(800).Height(500).Title("SoLoud MOD Demo")); + Gfx::Setup(GfxDesc() + .Width(800).Height(500) + .Title("SoLoud MOD Demo") + .HtmlTrackElementSize(true)); Input::Setup(); IMUI::Setup(); diff --git a/src/SoloudTedSid/SoloudTedSid.cc b/src/SoloudTedSid/SoloudTedSid.cc index b6d8199..76d32c3 100644 --- a/src/SoloudTedSid/SoloudTedSid.cc +++ b/src/SoloudTedSid/SoloudTedSid.cc @@ -61,7 +61,7 @@ SoloudTedSidApp::OnRunning() { Gfx::BeginPass(PassAction().Clear(0.2f, 0.4f, 0.8f, 1.0f)); IMUI::NewFrame(); - ImGui::SetNextWindowPos(ImVec2(500, 20), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(500, 40), ImGuiSetCond_Once); ImGui::Begin("Output"); ImGui::PlotLines("##Wave", buf, 256, 0, "Wave", -1, 1, ImVec2(264, 80)); ImGui::PlotHistogram("##FFT", fft, 256/2, 0, "FFT", 0, 10, ImVec2(264, 80), 8); @@ -114,7 +114,7 @@ SoloudTedSidApp::OnRunning() { (int)this->soloud.getInfo(this->musicHandle2, 68)); ImGui::End(); - ImGui::SetNextWindowPos(ImVec2(20, 20), ImGuiSetCond_Once); + ImGui::SetNextWindowPos(ImVec2(20, 40), ImGuiSetCond_Once); ImGui::Begin("Control", nullptr, ImVec2(300, -1)); ImGui::Text("Song volumes"); if (ImGui::SliderFloat("Song1 vol", &this->music1Volume, 0, 1)) { @@ -152,7 +152,10 @@ SoloudTedSidApp::OnInit() { IO::Setup(IODesc() .Assign("snd:", ORYOL_SAMPLE_URL) .FileSystem("http", HTTPFileSystem::Creator())); - Gfx::Setup(GfxDesc().Width(800).Height(460).Title("SoLoud TED/SID Demo")); + Gfx::Setup(GfxDesc() + .Width(800).Height(460) + .Title("SoLoud TED/SID Demo") + .HtmlTrackElementSize(true)); Input::Setup(); IMUI::Setup(); diff --git a/src/SoundTest/SoundTest.cc b/src/SoundTest/SoundTest.cc index 51e3e6f..91a8a29 100644 --- a/src/SoundTest/SoundTest.cc +++ b/src/SoundTest/SoundTest.cc @@ -67,7 +67,10 @@ const char* SoundTestApp::uiEffectNames[SoundTestApp::NumEffects] = { //------------------------------------------------------------------------------ AppState::Code SoundTestApp::OnInit() { - Gfx::Setup(GfxDesc().Width(1024).Height(480).Title("Sound Test")); + Gfx::Setup(GfxDesc() + .Width(1024).Height(480) + .Title("Sound Test") + .HtmlTrackElementSize(true)); Input::Setup(); Sound::Setup(SoundSetup()); IMUI::Setup(); @@ -372,11 +375,11 @@ SoundTestApp::OnInit() { //------------------------------------------------------------------------------ AppState::Code SoundTestApp::OnRunning() { - Gfx::BeginPass(PassAction().Clear(0.75f, 0.75f, 0.75f, 1.0f)); + Gfx::BeginPass(); IMUI::NewFrame(); // draw UI - ImGui::SetNextWindowPos(ImVec2(0, 0)); + ImGui::SetNextWindowPos(ImVec2(0, 40)); ImGui::Begin("SoundTest", nullptr, ImVec2(1024, 400)); if (ImGui::Button("Play!")) { Sound::Play(this->effects[this->uiCurEffect].id); diff --git a/src/StbVoxelDemo/Main.cc b/src/StbVoxelDemo/Main.cc index cce789e..292f79d 100644 --- a/src/StbVoxelDemo/Main.cc +++ b/src/StbVoxelDemo/Main.cc @@ -50,7 +50,8 @@ VoxelTest::OnInit() { .SampleCount(4) .Title("Oryol Voxel Test") .ResourcePoolSize(GfxResourceType::Pipeline, 1024) - .ResourcePoolSize(GfxResourceType::Buffer, 1024); + .ResourcePoolSize(GfxResourceType::Buffer, 1024) + .HtmlTrackElementSize(true); Gfx::Setup(gfxDesc); Input::Setup(); Input::SetPointerLockHandler([](const InputEvent& event) -> PointerLockMode::Code { @@ -168,7 +169,7 @@ VoxelTest::OnRunning() { } } } - Dbg::PrintF("\n\r" + Dbg::PrintF("\n\n\n\n\n\r" " Desktop: LMB+Mouse or AWSD to move, RMB+Mouse to look around\n\r" " Mobile: touch+pan to fly\n\n\r" " draws: %d\n\r" diff --git a/src/TurboBadgerDemo/TurboBadgerDemo.cc b/src/TurboBadgerDemo/TurboBadgerDemo.cc index f05284f..fe2e548 100644 --- a/src/TurboBadgerDemo/TurboBadgerDemo.cc +++ b/src/TurboBadgerDemo/TurboBadgerDemo.cc @@ -63,7 +63,10 @@ TurboBadgerDemoApp::OnInit() { .Assign("res:", ORYOL_SAMPLE_URL) .Assign("ui:", "res:tbui/")); - Gfx::Setup(GfxDesc().Width(1000).Height(650).Title("TurboBadger UI Demo")); + Gfx::Setup(GfxDesc() + .Width(1000).Height(650) + .Title("TurboBadger UI Demo") + .HtmlTrackElementSize(true)); Dbg::Setup(); Input::Setup(); @@ -139,7 +142,7 @@ TurboBadgerDemoApp::OnRunning() { Gfx::CommitFrame(); Duration frameTime = Clock::LapTime(this->lastFrameTimePoint); - Dbg::PrintF("\n frame=%.3fms\n\r", frameTime.AsMilliSeconds()); + Dbg::PrintF("\n\n\n\n\n frame=%.3fms\n\r", frameTime.AsMilliSeconds()); return Gfx::QuitRequested() ? AppState::Cleanup : AppState::Running; } diff --git a/web/about.html b/web/about.html deleted file mode 100644 index 0f2d058..0000000 --- a/web/about.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - -Oryol About - - - - - -

ORYOL 2000©
-
- -
-Oryol is a very experimental, multiplatform, MIT-licensed, 3D engine, written in C++11. -

-The focus is on web and mobile platforms, and on providing a very lean general purpose engine -for realtime 3D apps. -

-A word of warning: The samples on this page use bleeding-edge browser features and thus -may accordingly require the bleeding-edge versions of browsers (like -Firefox Nightly or -Chrome Canary). -

-Enjoy! -
-
- - diff --git a/web/emsc.html b/web/emsc.html index 4d5b178..49a59cc 100644 --- a/web/emsc.html +++ b/web/emsc.html @@ -7,25 +7,13 @@ - -
${name}asm.js
-
- -