From 45f2f6aa8fc9991924091000a5bbcb02c222c801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Mon, 19 Feb 2018 18:26:51 +0200 Subject: [PATCH] Gloom|Refactor|Cleanup: Reorganized files; added Render base class --- doomsday/tests/test_gloom/CMakeLists.txt | 15 +- .../test_gloom/gloom/{ => geo}/geomath.cpp | 2 +- .../test_gloom/gloom/{ => geo}/geomath.h | 6 +- .../gloom/{render => geo}/polygon.cpp | 4 +- .../gloom/{render => geo}/polygon.h | 2 +- .../tests/test_gloom/gloom/gloomwidget.cpp | 30 ++- doomsday/tests/test_gloom/gloom/gloomwidget.h | 2 +- .../tests/test_gloom/gloom/gloomworld.cpp | 190 +++++++----------- doomsday/tests/test_gloom/gloom/gloomworld.h | 7 +- .../tests/test_gloom/gloom/render/context.cpp | 30 +++ .../tests/test_gloom/gloom/render/context.h | 47 +++++ .../test_gloom/gloom/render/entityrender.cpp | 55 +++-- .../test_gloom/gloom/render/entityrender.h | 16 +- .../tests/test_gloom/gloom/render/gbuffer.cpp | 66 +++++- .../tests/test_gloom/gloom/render/gbuffer.h | 14 +- .../test_gloom/gloom/render/mapbuild.cpp | 19 +- .../tests/test_gloom/gloom/render/mapbuild.h | 2 +- .../test_gloom/gloom/render/maprender.cpp | 86 ++++---- .../tests/test_gloom/gloom/render/maprender.h | 16 +- .../tests/test_gloom/gloom/render/render.cpp | 58 ++++++ .../tests/test_gloom/gloom/render/render.h | 50 +++++ .../tests/test_gloom/gloom/render/skybox.cpp | 50 +++-- .../tests/test_gloom/gloom/render/skybox.h | 17 +- .../tests/test_gloom/gloom/render/view.cpp | 31 +++ doomsday/tests/test_gloom/gloom/render/view.h | 39 ++++ .../tests/test_gloom/gloom/world/entity.cpp | 2 +- .../tests/test_gloom/gloom/world/entity.h | 2 +- .../test_gloom/gloom/world/entitymap.cpp | 2 +- .../tests/test_gloom/gloom/world/entitymap.h | 3 +- .../test_gloom/gloom/world/environment.cpp | 6 +- doomsday/tests/test_gloom/gloom/world/map.cpp | 3 +- doomsday/tests/test_gloom/gloom/world/map.h | 9 +- .../tests/test_gloom/gloom/world/user.cpp | 8 +- doomsday/tests/test_gloom/gloom/world/user.h | 6 +- .../tests/test_gloom/gloom/world/world.cpp | 8 +- doomsday/tests/test_gloom/gloom/world/world.h | 6 +- .../shaders/gbuffer.glsl | 13 ++ .../net.dengine.gloom.pack/shaders/gloom.dei | 27 +++ .../net.dengine.gloom.pack/shaders/model.dei | 3 + .../shaders/surface.fsh | 7 +- doomsday/tests/test_gloom/src/editor.cpp | 2 +- doomsday/tests/test_gloom/src/editor.h | 2 +- doomsday/tests/test_gloom/src/gloomapp.cpp | 14 +- doomsday/tests/test_gloom/src/gloomapp.h | 2 +- 44 files changed, 659 insertions(+), 320 deletions(-) rename doomsday/tests/test_gloom/gloom/{ => geo}/geomath.cpp (97%) rename doomsday/tests/test_gloom/gloom/{ => geo}/geomath.h (96%) rename doomsday/tests/test_gloom/gloom/{render => geo}/polygon.cpp (98%) rename doomsday/tests/test_gloom/gloom/{render => geo}/polygon.h (98%) create mode 100644 doomsday/tests/test_gloom/gloom/render/context.cpp create mode 100644 doomsday/tests/test_gloom/gloom/render/context.h create mode 100644 doomsday/tests/test_gloom/gloom/render/render.cpp create mode 100644 doomsday/tests/test_gloom/gloom/render/render.h create mode 100644 doomsday/tests/test_gloom/gloom/render/view.cpp create mode 100644 doomsday/tests/test_gloom/gloom/render/view.h create mode 100644 doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gbuffer.glsl diff --git a/doomsday/tests/test_gloom/CMakeLists.txt b/doomsday/tests/test_gloom/CMakeLists.txt index 32d79dca67..60e502ca73 100644 --- a/doomsday/tests/test_gloom/CMakeLists.txt +++ b/doomsday/tests/test_gloom/CMakeLists.txt @@ -29,12 +29,16 @@ set (SOURCES gloom/icamera.h gloom/ilight.h gloom/ident.h - gloom/geomath.cpp - gloom/geomath.h + gloom/geo/geomath.cpp + gloom/geo/geomath.h + gloom/geo/polygon.cpp + gloom/geo/polygon.h gloom/gloomwidget.cpp gloom/gloomwidget.h gloom/gloomworld.cpp gloom/gloomworld.h + gloom/render/context.cpp + gloom/render/context.h gloom/render/databuffer.h gloom/render/entityrender.cpp gloom/render/entityrender.h @@ -44,10 +48,12 @@ set (SOURCES gloom/render/mapbuild.h gloom/render/maprender.cpp gloom/render/maprender.h - gloom/render/polygon.cpp - gloom/render/polygon.h + gloom/render/render.cpp + gloom/render/render.h gloom/render/skybox.cpp gloom/render/skybox.h + gloom/render/view.cpp + gloom/render/view.h gloom/world/entity.cpp gloom/world/entity.h gloom/world/entitymap.cpp @@ -77,6 +83,7 @@ set (SOURCES deng_add_application (test_gloom ${SOURCES} ${HEADERS}) +target_include_directories (test_gloom PRIVATE ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries (test_gloom Deng::libappfw fmodex) if (APPLE) diff --git a/doomsday/tests/test_gloom/gloom/geomath.cpp b/doomsday/tests/test_gloom/gloom/geo/geomath.cpp similarity index 97% rename from doomsday/tests/test_gloom/gloom/geomath.cpp rename to doomsday/tests/test_gloom/gloom/geo/geomath.cpp index 623e705184..0f1ea5bbf7 100644 --- a/doomsday/tests/test_gloom/gloom/geomath.cpp +++ b/doomsday/tests/test_gloom/gloom/geo/geomath.cpp @@ -16,7 +16,7 @@ * http://www.gnu.org/licenses */ -#include "geomath.h" +#include "gloom/geo/geomath.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/geomath.h b/doomsday/tests/test_gloom/gloom/geo/geomath.h similarity index 96% rename from doomsday/tests/test_gloom/gloom/geomath.h rename to doomsday/tests/test_gloom/gloom/geo/geomath.h index e48a61ca75..a0a25d8c23 100644 --- a/doomsday/tests/test_gloom/gloom/geomath.h +++ b/doomsday/tests/test_gloom/gloom/geo/geomath.h @@ -71,10 +71,12 @@ struct Line T normal() const { - const auto dirVec = dir(); + /*const auto dirVec = dir(); return de::Vector3(dirVec.x, 0.0, dirVec.y) .cross(de::Vector3(0, 1, 0)) - .xz(); + .xz();*/ + const auto vec = dir(); + return T(-vec.y, vec.x); } void flip() diff --git a/doomsday/tests/test_gloom/gloom/render/polygon.cpp b/doomsday/tests/test_gloom/gloom/geo/polygon.cpp similarity index 98% rename from doomsday/tests/test_gloom/gloom/render/polygon.cpp rename to doomsday/tests/test_gloom/gloom/geo/polygon.cpp index e806d0eba7..7b2d7cf25c 100644 --- a/doomsday/tests/test_gloom/gloom/render/polygon.cpp +++ b/doomsday/tests/test_gloom/gloom/geo/polygon.cpp @@ -16,8 +16,8 @@ * http://www.gnu.org/licenses */ -#include "polygon.h" -#include "../geomath.h" +#include "gloom/geo/polygon.h" +#include "gloom/geo/geomath.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/render/polygon.h b/doomsday/tests/test_gloom/gloom/geo/polygon.h similarity index 98% rename from doomsday/tests/test_gloom/gloom/render/polygon.h rename to doomsday/tests/test_gloom/gloom/geo/polygon.h index b455710de2..e1a2101c0f 100644 --- a/doomsday/tests/test_gloom/gloom/render/polygon.h +++ b/doomsday/tests/test_gloom/gloom/geo/polygon.h @@ -22,7 +22,7 @@ #include #include #include -#include "../geomath.h" +#include "gloom/geo/geomath.h" namespace gloom { namespace geo { diff --git a/doomsday/tests/test_gloom/gloom/gloomwidget.cpp b/doomsday/tests/test_gloom/gloom/gloomwidget.cpp index 464b4ee6ac..81571e1f27 100644 --- a/doomsday/tests/test_gloom/gloom/gloomwidget.cpp +++ b/doomsday/tests/test_gloom/gloom/gloomwidget.cpp @@ -16,17 +16,17 @@ * http://www.gnu.org/licenses */ -#include "gloomwidget.h" -#include "audio/audiosystem.h" -#include "world/world.h" -#include "world/user.h" +#include "gloom/gloomwidget.h" +#include "gloom/audio/audiosystem.h" +#include "gloom/gloomworld.h" +#include "gloom/world/user.h" +#include "gloom/world/world.h" #include #include -#include +#include #include #include -#include using namespace de; @@ -35,7 +35,7 @@ namespace gloom { DENG_GUI_PIMPL(GloomWidget) { Matrix4f modelView; - World * world = nullptr; + SafePtr world; Time previousUpdateAt; User user; User::InputState inputs; @@ -173,6 +173,16 @@ bool GloomWidget::handleEvent(Event const &event) { const KeyEvent &key = event.as(); + // Check for some key commands. + if (key.isKeyDown()) + { + if (key.ddKey() == '1' || key.ddKey() == '2') + { + d->world->as().setDebugMode(key.ddKey() - '1'); + return true; + } + } + User::InputBit bit = User::Inert; switch (key.ddKey()) { @@ -204,6 +214,12 @@ bool GloomWidget::handleEvent(Event const &event) { const MouseEvent &mouse = event.as(); + if (mouse.type() == Event::MouseWheel) + { + d->user.turn(Vector2f(mouse.wheel())/10.f); + return true; + } + if (d->mouseLook) { const Vector2i delta = mouse.pos() - d->lastMousePos; diff --git a/doomsday/tests/test_gloom/gloom/gloomwidget.h b/doomsday/tests/test_gloom/gloom/gloomwidget.h index ccf70fe4ae..9c085be66a 100644 --- a/doomsday/tests/test_gloom/gloom/gloomwidget.h +++ b/doomsday/tests/test_gloom/gloom/gloomwidget.h @@ -20,7 +20,7 @@ #define GLOOMWIDGET_H #include -#include "icamera.h" +#include "gloom/icamera.h" namespace gloom { diff --git a/doomsday/tests/test_gloom/gloom/gloomworld.cpp b/doomsday/tests/test_gloom/gloom/gloomworld.cpp index c6417d75c4..a7253b56a3 100644 --- a/doomsday/tests/test_gloom/gloom/gloomworld.cpp +++ b/doomsday/tests/test_gloom/gloom/gloomworld.cpp @@ -16,17 +16,18 @@ * http://www.gnu.org/licenses */ -#include "gloomworld.h" -#include "ilight.h" -#include "audio/audiosystem.h" -#include "render/gbuffer.h" -#include "render/maprender.h" -#include "render/skybox.h" -#include "world/entitymap.h" -#include "world/environment.h" -#include "world/map.h" -#include "world/user.h" -#include "../src/gloomapp.h" +#include "gloom/gloomworld.h" +#include "gloom/ilight.h" +#include "gloom/audio/audiosystem.h" +#include "gloom/render/context.h" +#include "gloom/render/gbuffer.h" +#include "gloom/render/maprender.h" +#include "gloom/render/skybox.h" +#include "gloom/world/entitymap.h" +#include "gloom/world/environment.h" +#include "gloom/world/map.h" +#include "gloom/world/user.h" +#include "../src/gloomapp.h" // access to shader bank #include #include @@ -40,26 +41,28 @@ using namespace de; namespace gloom { -DENG2_PIMPL(GloomWorld), public ILight +DENG2_PIMPL(GloomWorld), public Asset, public ILight , DENG2_OBSERVES(User, Warp) { User * localUser = nullptr; + Context renderContext; + Environment environ; GBuffer gbuffer; SkyBox sky; - Environment environ; - QHash initialPlaneY; Map map; + QHash initialPlaneY; MapRender mapRender; - float visibleDistance; - double currentTime{0}; + float visibleDistance; + double currentTime = 0.0; std::unique_ptr atlas; - GLUniform uModelProj { "uViewProjMatrix", GLUniform::Mat4 }; - GLUniform uViewPos { "uViewPos", GLUniform::Vec3 }; - GLUniform uFog { "uFog", GLUniform::Vec4 }; - GLUniform uLightDir { "uLightDir", GLUniform::Vec3 }; - GLUniform uTex { "uTex", GLUniform::Sampler2D }; + +// GLUniform uModelProj { "uViewProjMatrix", GLUniform::Mat4 }; +// GLUniform uViewPos { "uViewPos", GLUniform::Vec3 }; +// GLUniform uFog { "uFog", GLUniform::Vec4 }; +// GLUniform uLightDir { "uLightDir", GLUniform::Vec3 }; +// GLUniform uTex { "uTex", GLUniform::Sampler2D }; Impl(Public *i) : Base(i) @@ -77,7 +80,12 @@ DENG2_PIMPL(GloomWorld), public ILight atlas->setAutoGenMips(true); atlas->setFilter(gl::Linear, gl::Linear, gl::MipNearest); #endif - uTex = *atlas; + + renderContext.images = &GloomApp::images(); + renderContext.shaders = &GloomApp::shaders(); // TODO: remove dependency on App + renderContext.atlas = atlas.get(); + renderContext.uAtlas = renderContext.atlas; + renderContext.map = ↦ environ.setWorld(thisPublic); } @@ -99,32 +107,45 @@ DENG2_PIMPL(GloomWorld), public ILight // land.setMaterial(HeightField::Dirt, atlas->imageRectf(dirt)); // } - void glInit() + bool glInit() { + if (isReady()) return false; + + qDebug() << "[GloomWorld] glInit"; + DENG2_ASSERT(localUser); //loadTextures(); //loadModels(); - gbuffer.glInit(); +// gbuffer.setContext(renderContext); + gbuffer.glInit(renderContext); - sky.setAtlas(*atlas); +// sky.setContext(renderContext); +// sky.setAtlas(*atlas); sky.setSize(visibleDistance); - sky.glInit(); + sky.glInit(renderContext); + +// mapRender.setContext(renderContext); +// mapRender.setMap(map); +// mapRender.setAtlas(*atlas); + mapRender.glInit(renderContext); - mapRender.setMap(map); - mapRender.setAtlas(*atlas); - mapRender.glInit(); +// Vector3f const fogColor{.83f, .89f, 1.f}; +// uFog = Vector4f(fogColor, visibleDistance); - Vector3f const fogColor{.83f, .89f, 1.f}; - uFog = Vector4f(fogColor, visibleDistance); + setState(Ready); + return true; } void glDeinit() { - sky.glDeinit(); + setState(NotReady); + mapRender.glDeinit(); - gbuffer.glDeinit(); + sky .glDeinit(); + gbuffer .glDeinit(); + atlas->clear(); localUser->audienceForWarp -= this; @@ -162,6 +183,8 @@ DENG2_PIMPL(GloomWorld), public ILight { currentTime += elapsed; + renderContext.uCurrentTime = float(currentTime); + for (auto i = map.planes().begin(), end = map.planes().end(); i != end; ++i) { const float planeY = float(initialPlaneY[i.key()]) + @@ -199,78 +222,6 @@ DENG2_PIMPL(GloomWorld), public ILight // height.normalAtPosition(pos + Vector2f(1, 1)).y < -.9); // } -// void generateEntities() -// { -// for(int i = 0; i < 10000; ++i) -// { -// Vector2f pos; -// do -// { -// pos = -mapSize/2 + Vector2f(frand() * mapSize.x, frand() * mapSize.y); -// } -// while(!isFlatSurface(pos)); - -// Entity *ent = new Entity; -// ent->setType(frand() < .333? Entity::Tree1 : frand() < .5? Entity::Tree2 : Entity::Tree3); -// ent->setAngle(frand() * 360); -// ent->setScale(.05f + frand() * .28); -// positionOnGround(*ent, pos); -// ents.insert(ent); -// } -// } - -// typedef GLBufferT InstanceBuf; - -// void drawEntities(ICamera const &camera) -// { -// uModelProj = camera.cameraModelViewProjection(); - -// float fullDist = 500; -// QList entities = ents.listRegionBackToFront(camera.cameraPosition(), fullDist); - -// InstanceBuf ibuf; - -// // Draw all model types. -// for(int i = 0; i < NUM_MODELS; ++i) -// { -// InstanceBuf::Builder data; - -// ModelDrawable const *model = &trees[i]; - -// // Set up the instance buffer. -// foreach(Entity const *e, entities) -// { -// if(e->type() != Entity::Tree1 + i) continue; - -// float dims = model->dimensions().z * e->scale().y; - -// float maxDist = min(fullDist, dims * 10); -// float fadeItv = .333f * maxDist; -// float distance = (e->position() - camera.cameraPosition()).length(); - -// if(distance < maxDist) -// { -// InstanceBuf::Type inst; -// inst.matrix = -// Matrix4f::translate(e->position()) * -// Matrix4f::rotate(e->angle(), Vector3f(0, -1, 0)) * -// Matrix4f::rotate(90, Vector3f(1, 0, 0)) * -// Matrix4f::scale(e->scale()); - -// // Fade in the distance. -// inst.color = Vector4f(1, 1, 1, clamp(0.f, 1.f - (distance - maxDist + fadeItv)/fadeItv, 1.f)); - -// data << inst; -// } -// } - -// if(!data.isEmpty()) -// { -// ibuf.setVertices(data, gl::Dynamic); -// model->drawInstanced(ibuf); -// } -// } -// } }; GloomWorld::GloomWorld() : d(new Impl(this)) @@ -278,10 +229,12 @@ GloomWorld::GloomWorld() : d(new Impl(this)) void GloomWorld::glInit() { - d->glInit(); - DENG2_FOR_AUDIENCE(Ready, i) + if (d->glInit()) { - i->worldReady(*this); + DENG2_FOR_AUDIENCE(Ready, i) + { + i->worldReady(*this); + } } } @@ -299,8 +252,6 @@ void GloomWorld::update(TimeSpan const &elapsed) void GloomWorld::render(ICamera const &camera) { - //DENG2_ASSERT(d->modelProgram.isReady()); - d->gbuffer.resize(GLState::current().target().size()); d->gbuffer.clear(); @@ -309,20 +260,22 @@ void GloomWorld::render(ICamera const &camera) .setCull(gl::Back) .setDepthTest(true); - const Matrix4f mvp = camera.cameraModelViewProjection(); + //const Matrix4f mvp = camera.cameraModelViewProjection(); - d->uViewPos = camera.cameraPosition(); - d->uLightDir = d->lightDirection(); + d->renderContext.view.setCamera(camera); - d->mapRender.render(camera); - d->sky.render(mvp * Matrix4f::translate(camera.cameraPosition())); +// d->uViewPos = camera.cameraPosition(); +// d->uLightDir = d->lightDirection(); + + d->mapRender.render(); + d->sky.render(); //mvp * Matrix4f::translate(camera.cameraPosition())); // d->land.draw(mvp); // d->drawEntities(camera); GLState::pop(); - d->gbuffer.blit(); + d->gbuffer.render(); } User *GloomWorld::localUser() const @@ -377,4 +330,9 @@ void GloomWorld::setMap(const Map &map) d->rebuildMap(); } +void GloomWorld::setDebugMode(int debugMode) +{ + d->gbuffer.setDebugMode(debugMode); +} + } // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/gloomworld.h b/doomsday/tests/test_gloom/gloom/gloomworld.h index a204522121..86e83d66c3 100644 --- a/doomsday/tests/test_gloom/gloom/gloomworld.h +++ b/doomsday/tests/test_gloom/gloom/gloomworld.h @@ -19,9 +19,9 @@ #ifndef GLOOMWORLD_H #define GLOOMWORLD_H -#include "../gloom/icamera.h" -#include "../gloom/world/user.h" -#include "../gloom/world/world.h" +#include "gloom/icamera.h" +#include "gloom/world/user.h" +#include "gloom/world/world.h" namespace gloom { @@ -34,6 +34,7 @@ class GloomWorld : public World void setLocalUser(User *user); void setMap(const Map &map); + void setDebugMode(int debugMode); void glInit(); void glDeinit(); diff --git a/doomsday/tests/test_gloom/gloom/render/context.cpp b/doomsday/tests/test_gloom/gloom/render/context.cpp new file mode 100644 index 0000000000..54a67a819b --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/context.cpp @@ -0,0 +1,30 @@ +/** @file context.cpp + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#include "gloom/render/context.h" + +using namespace de; + +namespace gloom { + +void Context::bind(GLProgram &program) const +{ + program << uAtlas << uCurrentTime << view.uMvpMatrix << view.uWorldToViewMatrix; +} + +} // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/render/context.h b/doomsday/tests/test_gloom/gloom/render/context.h new file mode 100644 index 0000000000..8632d2b8d2 --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/context.h @@ -0,0 +1,47 @@ +/** @file context.h + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#ifndef GLOOM_CONTEXT_H +#define GLOOM_CONTEXT_H + +#include "gloom/render/view.h" +#include "gloom/world/map.h" + +#include +#include +#include +#include + +namespace gloom { + +struct Context { + const de::ImageBank *images; + de::GLShaderBank * shaders; + const Map * map; + de::AtlasTexture * atlas; + View view; + + de::GLUniform uAtlas {"uTex", de::GLUniform::Sampler2D}; + de::GLUniform uCurrentTime {"uCurrentTime", de::GLUniform::Float}; + + void bind(de::GLProgram &) const; +}; + +} // namespace gloom + +#endif // GLOOM_CONTEXT_H diff --git a/doomsday/tests/test_gloom/gloom/render/entityrender.cpp b/doomsday/tests/test_gloom/gloom/render/entityrender.cpp index 0de217dc9d..4e83ef97c0 100644 --- a/doomsday/tests/test_gloom/gloom/render/entityrender.cpp +++ b/doomsday/tests/test_gloom/gloom/render/entityrender.cpp @@ -17,9 +17,9 @@ */ #include "entityrender.h" -#include "../world/map.h" -#include "../icamera.h" -#include "../../src/gloomapp.h" +#include "gloom/world/map.h" +#include "gloom/icamera.h" +#include "src/gloomapp.h" #include #include @@ -42,13 +42,15 @@ LIBGUI_VERTEX_FORMAT_SPEC(InstanceData, 20 * sizeof(float)) DENG2_PIMPL(EntityRender) { - const Map *map = nullptr; - AtlasTexture *atlas; +// const Context *context = nullptr; +// const View * view = nullptr; +// const Map * map = nullptr; +// AtlasTexture *atlas; EntityMap ents; ModelDrawable entityModels[3]; GLProgram modelProgram; - GLUniform uMvpMatrix{"uMvpMatrix", GLUniform::Mat4}; - GLUniform uTex {"uTex", GLUniform::Sampler2D}; +// GLUniform uMvpMatrix {"uMvpMatrix", GLUniform::Mat4}; +// GLUniform uWorldToViewMatrix{"uWorldToViewMatrix", GLUniform::Mat3}; Impl(Public *i) : Base(i) @@ -73,6 +75,7 @@ DENG2_PIMPL(EntityRender) void loadModels() { + const auto &context = self().context(); auto const &pkg = PackageLoader::get().package("net.dengine.gloom"); const char *filenames[] = { @@ -85,23 +88,28 @@ DENG2_PIMPL(EntityRender) for (auto &model : entityModels) { model.load(pkg.root().locate(filenames[idx])); - model.setAtlas(*atlas); + model.setAtlas(*context.atlas); model.setProgram(&modelProgram); idx++; } - GloomApp::shaders().build(modelProgram, "gloom.entity") << uMvpMatrix << uTex; + GloomApp::shaders().build(modelProgram, "gloom.entity") + << context.view.uMvpMatrix + << context.view.uWorldToViewMatrix + << context.uAtlas; } void create() { - DENG2_ASSERT(map); + DENG2_ASSERT(self().context().map); + + const auto &map = *self().context().map; ents.clear(); - ents.setBounds(map->bounds()); + ents.setBounds(map.bounds()); // Create entities for all objects defined in the map. - for (auto i = map->entities().begin(), end = map->entities().end(); i != end; ++i) + for (auto i = map.entities().begin(), end = map.entities().end(); i != end; ++i) { ents.insert(*i.value()); } @@ -109,9 +117,9 @@ DENG2_PIMPL(EntityRender) typedef GLBufferT InstanceBuf; - void render(const ICamera &camera) + void render() { - uMvpMatrix = camera.cameraModelViewProjection(); + const ICamera &camera = *self().context().view.camera; float fullDist = 500; const auto entities = ents.listRegionBackToFront(camera.cameraPosition(), fullDist); @@ -163,20 +171,16 @@ EntityRender::EntityRender() : d(new Impl(this)) {} -void EntityRender::setAtlas(AtlasTexture *atlas) -{ - d->atlas = atlas; - d->uTex = *atlas; -} - -void EntityRender::glInit() +void EntityRender::glInit(const Context &context) { + Render::glInit(context); d->init(); } void EntityRender::glDeinit() { d->deinit(); + Render::glDeinit(); } void EntityRender::createEntities() @@ -189,14 +193,9 @@ EntityMap &EntityRender::entityMap() return d->ents; } -void EntityRender::setMap(const Map *map) -{ - d->map = map; -} - -void EntityRender::render(const ICamera &camera) +void EntityRender::render() { - d->render(camera); + d->render(); } } // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/render/entityrender.h b/doomsday/tests/test_gloom/gloom/render/entityrender.h index f1abcb294e..268935ebd0 100644 --- a/doomsday/tests/test_gloom/gloom/render/entityrender.h +++ b/doomsday/tests/test_gloom/gloom/render/entityrender.h @@ -19,7 +19,8 @@ #ifndef GLOOM_ENTITIES_H #define GLOOM_ENTITIES_H -#include "../world/entitymap.h" +#include "gloom/world/entitymap.h" +#include "gloom/render/render.h" #include @@ -28,21 +29,18 @@ namespace gloom { class ICamera; class Map; -class EntityRender +class EntityRender : public Render { public: EntityRender(); EntityMap &entityMap(); - - void setMap(const Map *map); - void setAtlas(de::AtlasTexture *atlas); - void glInit(); - void glDeinit(); - void render(const ICamera &camera); - void createEntities(); + void glInit(const Context &) override; + void glDeinit() override; + void render() override; + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/tests/test_gloom/gloom/render/gbuffer.cpp b/doomsday/tests/test_gloom/gloom/render/gbuffer.cpp index 3be0382a46..d58eabc097 100644 --- a/doomsday/tests/test_gloom/gloom/render/gbuffer.cpp +++ b/doomsday/tests/test_gloom/gloom/render/gbuffer.cpp @@ -16,22 +16,41 @@ * http://www.gnu.org/licenses */ -#include "gbuffer.h" +#include "gloom/render/gbuffer.h" -#include +#include #include +#include +#include +#include using namespace de; namespace gloom { +static const int BUF_ID = 1; + DENG2_PIMPL(GBuffer) { GLTextureFramebuffer frame{ - QList({Image::RGBA_16f /* albedo */, Image::RGB_888 /* normals */})}; + QList({Image::RGBA_16f /* albedo */, Image::RGBA_8888 /* normals */})}; + Drawable drawable; + GLState state; + GLUniform uMvpMatrix {"uMvpMatrix", GLUniform::Mat4}; + GLUniform uGBufferAlbedo {"uGBufferAlbedo", GLUniform::Sampler2D}; + GLUniform uGBufferNormal {"uGBufferNormal", GLUniform::Sampler2D}; + GLUniform uGBufferDepth {"uGBufferDepth", GLUniform::Sampler2D}; + GLUniform uDebugMode {"uDebugMode", GLUniform::Int}; Impl(Public *i) : Base(i) - {} + { + state.setBlend(false); + state.setCull(gl::None); + state.setDepthTest(false); + state.setDepthWrite(false); + + uDebugMode = 0; + } void setSize(const Vector2ui &size) { @@ -43,14 +62,29 @@ GBuffer::GBuffer() : d(new Impl(this)) {} -void GBuffer::glInit() +void GBuffer::glInit(const Context &context) { + Render::glInit(context); d->frame.glInit(); + + using VBuf = GLBufferT; + VBuf *vbuf = new VBuf; + vbuf->setVertices(gl::TriangleStrip, + VBuf::Builder().makeQuad(Rectanglef(0, 0, 1, 1), Rectanglef(0, 1, 1, -1)), + gl::Static); + d->drawable.addBuffer(BUF_ID, vbuf); + + context.shaders->build(d->drawable.program(), "gloom.finalize") + << d->uMvpMatrix + << d->uGBufferAlbedo << d->uGBufferNormal << d->uGBufferDepth + << d->uDebugMode; } void GBuffer::glDeinit() { + d->drawable.clear(); d->frame.glDeinit(); + Render::glDeinit(); } void GBuffer::resize(const Vector2ui &size) @@ -63,9 +97,27 @@ void GBuffer::clear() d->frame.clear(GLFramebuffer::ColorAny | GLFramebuffer::DepthStencil); } -void GBuffer::blit() +void GBuffer::render() +{ + d->uMvpMatrix = Matrix4f::ortho(0, 1, 0, 1); + + d->state.setViewport(GLState::current().viewport()) + .setTarget (GLState::current().target()); + + d->drawable.setState(BUF_ID, d->state); + + d->uGBufferAlbedo = d->frame.attachedTexture(GLFramebuffer::Color0); + d->uGBufferNormal = d->frame.attachedTexture(GLFramebuffer::Color1); + d->uGBufferDepth = d->frame.attachedTexture(GLFramebuffer::DepthStencil); + + d->drawable.draw(); +} + +void gloom::GBuffer::setDebugMode(int debugMode) { - d->frame.blit(GLState::current().target()); + LOG_AS("GBuffer"); + LOG_MSG("Changing debug mode: %i") << debugMode; + d->uDebugMode = debugMode; } GLFramebuffer &GBuffer::framebuf() diff --git a/doomsday/tests/test_gloom/gloom/render/gbuffer.h b/doomsday/tests/test_gloom/gloom/render/gbuffer.h index 4d8ce0bc42..5eadde2bd4 100644 --- a/doomsday/tests/test_gloom/gloom/render/gbuffer.h +++ b/doomsday/tests/test_gloom/gloom/render/gbuffer.h @@ -22,21 +22,25 @@ #include #include +#include "gloom/render/render.h" + namespace gloom { /** * G-buffer used for rendering. */ -class GBuffer +class GBuffer : public Render { public: GBuffer(); - void glInit(); - void glDeinit(); - void resize(const de::Vector2ui &size); + void glInit(const Context &) override; + void glDeinit() override; + void render() override; + void clear(); - void blit(); + void resize(const de::Vector2ui &size); + void setDebugMode(int debugMode); de::GLFramebuffer &framebuf(); diff --git a/doomsday/tests/test_gloom/gloom/render/mapbuild.cpp b/doomsday/tests/test_gloom/gloom/render/mapbuild.cpp index 6d2810919e..7ec3af39cf 100644 --- a/doomsday/tests/test_gloom/gloom/render/mapbuild.cpp +++ b/doomsday/tests/test_gloom/gloom/render/mapbuild.cpp @@ -16,9 +16,9 @@ * http://www.gnu.org/licenses */ -#include "mapbuild.h" -#include "polygon.h" -#include "../geomath.h" +#include "gloom/render/mapbuild.h" +#include "gloom/geo/polygon.h" +#include "gloom/geo/geomath.h" #include @@ -51,15 +51,10 @@ DENG2_PIMPL_NOREF(MapBuild) , textures(textures) {} - Vector3f vertex(ID id) const + Vector3f worldNormalVector(const Line &line) const { - const Point &point = map.point(id); - return Vector3f{float(point.x), 0.f, float(point.y)}; - } - - Vector3f normalVector(const Line &line) const - { - return geo::Line(vertex(line.points[0]), vertex(line.points[1])).normal(); + Vector2d norm = geo::Line2d(map.point(line.points[0]), map.point(line.points[1])).normal(); + return Vector3d(norm.x, 0.0, norm.y); } /** @@ -214,7 +209,7 @@ DENG2_PIMPL_NOREF(MapBuild) const int dir = line.sectors[0] == sectorId? 1 : 0; const ID start = line.points[dir^1]; const ID end = line.points[dir]; - const Vector3f normal = normalVector(line); + const Vector3f normal = worldNormalVector(line); const float length = float((floor[end] - floor[start]).length()); const uint32_t planeIndex[2] = {planeMapper[map.floorPlaneId(sectorId)], planeMapper[map.ceilingPlaneId(sectorId)]}; diff --git a/doomsday/tests/test_gloom/gloom/render/mapbuild.h b/doomsday/tests/test_gloom/gloom/render/mapbuild.h index 91cb7801a2..2d2e26ee3c 100644 --- a/doomsday/tests/test_gloom/gloom/render/mapbuild.h +++ b/doomsday/tests/test_gloom/gloom/render/mapbuild.h @@ -19,7 +19,7 @@ #ifndef GLOOM_MAPBUILD_H #define GLOOM_MAPBUILD_H -#include "../world/map.h" +#include "gloom/world/map.h" #include #include diff --git a/doomsday/tests/test_gloom/gloom/render/maprender.cpp b/doomsday/tests/test_gloom/gloom/render/maprender.cpp index ef4becd5a6..c6d04d452e 100644 --- a/doomsday/tests/test_gloom/gloom/render/maprender.cpp +++ b/doomsday/tests/test_gloom/gloom/render/maprender.cpp @@ -16,12 +16,11 @@ * http://www.gnu.org/licenses */ -#include "maprender.h" -#include "mapbuild.h" -#include "databuffer.h" -#include "entityrender.h" -#include "../icamera.h" -#include "../../src/gloomapp.h" +#include "gloom/render/maprender.h" +#include "gloom/render/mapbuild.h" +#include "gloom/render/databuffer.h" +#include "gloom/render/entityrender.h" +#include "gloom/icamera.h" #include #include @@ -32,10 +31,10 @@ namespace gloom { DENG2_PIMPL(MapRender) { - const Map *map = nullptr; - double currentTime; +// const Context *context = nullptr; +// double currentTime; - AtlasTexture * atlas = nullptr; +// AtlasTexture * atlas = nullptr; MapBuild::TextureIds textures; MapBuild::Mapper planeMapper; MapBuild::Mapper texOffsetMapper; @@ -56,10 +55,11 @@ DENG2_PIMPL(MapRender) }; DataBuffer texOffsets{"uTexOffsets", Image::RGBA_32f}; - GLUniform uMvpMatrix {"uMvpMatrix", GLUniform::Mat4}; - GLUniform uTex {"uTex", GLUniform::Sampler2D}; - GLUniform uCurrentTime {"uCurrentTime", GLUniform::Float}; - GLUniform uTexelsPerMeter {"uTexelsPerMeter", GLUniform::Float}; +// GLUniform uMvpMatrix {"uMvpMatrix", GLUniform::Mat4}; +// GLUniform uWorldToViewMatrix{"uWorldToViewMatrix", GLUniform::Mat3}; +// GLUniform uTex {"uTex", GLUniform::Sampler2D}; +// GLUniform uCurrentTime {"uCurrentTime", GLUniform::Float}; + GLUniform uTexelsPerMeter {"uTexelsPerMeter", GLUniform::Float}; Drawable drawable; EntityRender ents; @@ -74,7 +74,7 @@ DENG2_PIMPL(MapRender) void loadTexture(const String &name) { - const Id id = atlas->alloc(GloomApp::images().image(name)); + const Id id = self().context().atlas->alloc(self().context().images->image(name)); loadedTextures.insert(name, id); } @@ -86,8 +86,8 @@ DENG2_PIMPL(MapRender) for (auto i = loadedTextures.begin(); i != loadedTextures.end(); ++i) { // Load up metrics in an array. - const Rectanglei rect = atlas->imageRect(i.value()); - const Rectanglef rectf = atlas->imageRectf(i.value()); + const Rectanglei rect = self().context().atlas->imageRect(i.value()); + const Rectanglef rectf = self().context().atlas->imageRectf(i.value()); const uint32_t texId = textureMetrics.append( Metrics{{rectf.xywh()}, {Vector4f(rect.width(), rect.height())}}); textures.insert(i.key(), texId); @@ -98,6 +98,9 @@ DENG2_PIMPL(MapRender) void buildMap() { + const auto &context = self().context(); + const auto *map = context.map; + drawable.clear(); DENG2_ASSERT(map); @@ -123,16 +126,14 @@ DENG2_PIMPL(MapRender) drawable.addBuffer(buf); - GloomApp::shaders().build(drawable.program(), "gloom.surface") - << uMvpMatrix << uCurrentTime << uTexelsPerMeter << uTex << textureMetrics.var - << planes.var << texOffsets.var; + context.shaders->build(drawable.program(), "gloom.surface") + << uTexelsPerMeter << textureMetrics.var << planes.var << texOffsets.var; + context.bind(drawable.program()); } void glInit() { - ents.setAtlas(atlas); - ents.setMap(map); - ents.glInit(); + ents.glInit(self().context()); uTexelsPerMeter = 200; @@ -151,9 +152,10 @@ DENG2_PIMPL(MapRender) void glDeinit() { ents.glDeinit(); + for (const Id &texId : loadedTextures) { - atlas->release(texId); + self().context().atlas->release(texId); } loadedTextures.clear(); textureMetrics.clear(); @@ -167,26 +169,16 @@ MapRender::MapRender() : d(new Impl(this)) {} -void MapRender::setAtlas(AtlasTexture &atlas) -{ - d->atlas = &atlas; - d->uTex = atlas; -} - -void MapRender::setMap(const Map &map) -{ - d->clear(); - d->map = ↦ -} - -void MapRender::glInit() +void MapRender::glInit(const Context &context) { + Render::glInit(context); d->glInit(); } void MapRender::glDeinit() { d->glDeinit(); + Render::glDeinit(); } void MapRender::rebuild() @@ -195,18 +187,18 @@ void MapRender::rebuild() d->ents.createEntities(); } -void MapRender::advanceTime(const TimeSpan &elapsed) +void MapRender::advanceTime(TimeSpan) { - d->currentTime += elapsed; +// d->currentTime += elapsed; - const float now = float(d->currentTime); - d->uCurrentTime = now; +// const float now = float(d->currentTime); +// d->uCurrentTime = now; // Update plane heights. { for (auto i = d->planeMapper.begin(), end = d->planeMapper.end(); i != end; ++i) { - const float planeY = float(d->map->plane(i.key()).point.y); // + + const float planeY = float(context().map->plane(i.key()).point.y); // + //std::sin(i.value() + now * .1f); d->planes.setData(i.value(), planeY); @@ -225,17 +217,15 @@ void MapRender::advanceTime(const TimeSpan &elapsed) } } #endif -} -void MapRender::render(const ICamera &camera) -{ - d->planes .update(); d->texOffsets.update(); + d->planes.update(); +} - d->uMvpMatrix = camera.cameraModelViewProjection(); +void MapRender::render() +{ d->drawable.draw(); - - d->ents.render(camera); + d->ents.render(); } } // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/render/maprender.h b/doomsday/tests/test_gloom/gloom/render/maprender.h index f213219bff..49bf01a5d5 100644 --- a/doomsday/tests/test_gloom/gloom/render/maprender.h +++ b/doomsday/tests/test_gloom/gloom/render/maprender.h @@ -20,25 +20,25 @@ #define GLOOM_MAPRENDER_H #include -#include "../world/map.h" + +#include "gloom/world/map.h" +#include "gloom/render/render.h" namespace gloom { class ICamera; -class MapRender +class MapRender : public Render { public: MapRender(); - void setAtlas(de::AtlasTexture &atlas); - void setMap(const Map &map); + void glInit(const Context &) override; + void glDeinit() override; + void advanceTime(de::TimeSpan elapsed) override; + void render() override; - void glInit(); - void glDeinit(); void rebuild(); - void advanceTime(const de::TimeSpan &elapsed); - void render(const ICamera &camera); private: DENG2_PRIVATE(d) diff --git a/doomsday/tests/test_gloom/gloom/render/render.cpp b/doomsday/tests/test_gloom/gloom/render/render.cpp new file mode 100644 index 0000000000..dcecd0f87c --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/render.cpp @@ -0,0 +1,58 @@ +/** @file render.cpp + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#include "gloom/render/render.h" + +namespace gloom { + +DENG2_PIMPL_NOREF(Render) +{ + const Context *context = nullptr; +}; + +Render::Render() + : d(new Impl) +{} + +Render::~Render() +{ + DENG2_ASSERT(d->context == nullptr); +} + +const Context &Render::context() const +{ + DENG2_ASSERT(d->context); + return *d->context; +} + +void Render::glInit(const Context &context) +{ + DENG2_ASSERT(d->context == nullptr); + d->context = &context; +} + +void Render::glDeinit() +{ + DENG2_ASSERT(d->context != nullptr); + d->context = nullptr; +} + +void Render::advanceTime(de::TimeSpan) +{} + +} // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/render/render.h b/doomsday/tests/test_gloom/gloom/render/render.h new file mode 100644 index 0000000000..b1ee4bfb89 --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/render.h @@ -0,0 +1,50 @@ +/** @file render.h + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#ifndef GLOOM_RENDER_H +#define GLOOM_RENDER_H + +#include "gloom/render/context.h" +#include + +namespace gloom { + +/** + * Renderer component. + */ +class Render +{ +public: + Render(); + virtual ~Render(); + + const Context &context() const; + + virtual void glInit(const Context &context); + virtual void glDeinit(); + + virtual void advanceTime(de::TimeSpan elapsed); + virtual void render() = 0; + +private: + DENG2_PRIVATE(d) +}; + +} // namespace gloom + +#endif // GLOOM_RENDER_H diff --git a/doomsday/tests/test_gloom/gloom/render/skybox.cpp b/doomsday/tests/test_gloom/gloom/render/skybox.cpp index 052d5d5406..52964060f9 100644 --- a/doomsday/tests/test_gloom/gloom/render/skybox.cpp +++ b/doomsday/tests/test_gloom/gloom/render/skybox.cpp @@ -16,8 +16,7 @@ * http://www.gnu.org/licenses */ -#include "skybox.h" -#include "../../src/gloomapp.h" +#include "gloom/render/skybox.h" #include @@ -29,40 +28,55 @@ DENG2_PIMPL_NOREF(SkyBox) { typedef GLBufferT VBuf; - AtlasTexture *atlas{nullptr}; +// const Context *context = nullptr; +// AtlasTexture *atlas{nullptr}; Id skyTex; Drawable skyBox; GLUniform uMvpMatrix{"uMvpMatrix", GLUniform::Mat4}; - GLUniform uTex {"uTex", GLUniform::Sampler2D}; +// GLUniform uTex {"uTex", GLUniform::Sampler2D}; float scale = 1.f; }; SkyBox::SkyBox() : d(new Impl) {} -void SkyBox::setAtlas(AtlasTexture &atlas) -{ - d->atlas = &atlas; - d->uTex = atlas; -} +//void SkyBox::setContext(const Context &ctx) +//{ +// d->context = &ctx; +//} + +//void SkyBox::setAtlas(AtlasTexture &atlas) +//{ +// d->atlas = &atlas; +// d->uTex = atlas; +//} + +//void gloom::SkyBox::setView(const View &view) +//{ +// d->view = &view; +//} void SkyBox::setSize(float scale) { d->scale = scale; } -void SkyBox::glInit() +void SkyBox::glInit(const Context &context) { + Render::glInit(context); + using VBuf = Impl::VBuf; - d->skyTex = d->atlas->alloc(GloomApp::images().image("sky.day")); + auto *atlas = context.atlas; + + d->skyTex = atlas->alloc(context.images->image("sky.day")); // Make a sky box. VBuf *buf = new VBuf; VBuf::Builder verts; VBuf::Type v; - v.texBounds = d->atlas->imageRectf(d->skyTex).xywh(); + v.texBounds = atlas->imageRectf(d->skyTex).xywh(); v.texCoord[1] = Vector2f(512, 512); v.rgba = Vector4f(1, 1, 1, 1); @@ -95,22 +109,26 @@ void SkyBox::glInit() buf->setVertices(gl::TriangleStrip, verts, gl::Static); d->skyBox.addBuffer(buf); - GloomApp::shaders().build(d->skyBox.program(), "indirect.textured.color") + context.shaders->build(d->skyBox.program(), "indirect.textured.color") << d->uMvpMatrix - << d->uTex; + << context.uAtlas; } void SkyBox::glDeinit() { d->skyBox.clear(); + Render::glDeinit(); } -void SkyBox::render(Matrix4f const &mvpMatrix) +void SkyBox::render() { GLState::push().setDepthWrite(false); DENG2_ASSERT(d->skyBox.program().isReady()); - d->uMvpMatrix = mvpMatrix * Matrix4f::scale(d->scale); + + d->uMvpMatrix = context().view.uMvpMatrix.toMatrix4f() * + Matrix4f::translate(context().view.camera->cameraPosition()) * + Matrix4f::scale(d->scale); d->skyBox.draw(); GLState::pop(); diff --git a/doomsday/tests/test_gloom/gloom/render/skybox.h b/doomsday/tests/test_gloom/gloom/render/skybox.h index befdd6a343..d492b7cb55 100644 --- a/doomsday/tests/test_gloom/gloom/render/skybox.h +++ b/doomsday/tests/test_gloom/gloom/render/skybox.h @@ -16,25 +16,26 @@ * http://www.gnu.org/licenses */ -#ifndef SKYBOX_H -#define SKYBOX_H +#ifndef GLOOM_SKYBOX_H +#define GLOOM_SKYBOX_H #include #include +#include "gloom/render/render.h" + namespace gloom { -class SkyBox +class SkyBox : public Render { public: SkyBox(); - void setAtlas(de::AtlasTexture &atlas); void setSize(float scale); - void glInit(); - void glDeinit(); - void render(de::Matrix4f const &mvpMatrix); + void glInit(const Context &) override; + void glDeinit() override; + void render() override; private: DENG2_PRIVATE(d) @@ -42,4 +43,4 @@ class SkyBox } // namespace gloom -#endif // SKYBOX_H +#endif // GLOOM_SKYBOX_H diff --git a/doomsday/tests/test_gloom/gloom/render/view.cpp b/doomsday/tests/test_gloom/gloom/render/view.cpp new file mode 100644 index 0000000000..cbc580688f --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/view.cpp @@ -0,0 +1,31 @@ +/** @file view.cpp + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#include "gloom/render/view.h" + +namespace gloom { + +void View::setCamera(const ICamera &camera) +{ + this->camera = &camera; + + uMvpMatrix = camera.cameraModelViewProjection(); + uWorldToViewMatrix = camera.cameraModelView().submatrix(0, 0); +} + +} // namespace gloom diff --git a/doomsday/tests/test_gloom/gloom/render/view.h b/doomsday/tests/test_gloom/gloom/render/view.h new file mode 100644 index 0000000000..cc53667413 --- /dev/null +++ b/doomsday/tests/test_gloom/gloom/render/view.h @@ -0,0 +1,39 @@ +/** @file view.h + * + * @authors Copyright (c) 2018 Jaakko Keränen + * + * @par License + * LGPL: http://www.gnu.org/licenses/lgpl.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. This program is distributed in the hope that it + * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. You should have received a copy of + * the GNU Lesser General Public License along with this program; if not, see: + * http://www.gnu.org/licenses + */ + +#ifndef GLOOM_VIEW_H +#define GLOOM_VIEW_H + +#include +#include "gloom/icamera.h" + +namespace gloom { + +struct View +{ + const ICamera *camera; + + de::GLUniform uMvpMatrix {"uMvpMatrix", de::GLUniform::Mat4}; + de::GLUniform uWorldToViewMatrix {"uWorldToViewMatrix", de::GLUniform::Mat3}; + + void setCamera(const ICamera &camera); +}; + +} // namespace gloom + +#endif // GLOOM_VIEW_H diff --git a/doomsday/tests/test_gloom/gloom/world/entity.cpp b/doomsday/tests/test_gloom/gloom/world/entity.cpp index f03a9f2e9c..233df1ea3e 100644 --- a/doomsday/tests/test_gloom/gloom/world/entity.cpp +++ b/doomsday/tests/test_gloom/gloom/world/entity.cpp @@ -16,7 +16,7 @@ * http://www.gnu.org/licenses */ -#include "entity.h" +#include "gloom/world/entity.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/world/entity.h b/doomsday/tests/test_gloom/gloom/world/entity.h index 27c74b86c0..a610ba58c9 100644 --- a/doomsday/tests/test_gloom/gloom/world/entity.h +++ b/doomsday/tests/test_gloom/gloom/world/entity.h @@ -20,7 +20,7 @@ #define GLOOM_ENTITY_H #include -#include "../ident.h" +#include "gloom/ident.h" namespace gloom { diff --git a/doomsday/tests/test_gloom/gloom/world/entitymap.cpp b/doomsday/tests/test_gloom/gloom/world/entitymap.cpp index ad1e843119..aa632837b9 100644 --- a/doomsday/tests/test_gloom/gloom/world/entitymap.cpp +++ b/doomsday/tests/test_gloom/gloom/world/entitymap.cpp @@ -16,7 +16,7 @@ * http://www.gnu.org/licenses */ -#include "entitymap.h" +#include "gloom/world/entitymap.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/world/entitymap.h b/doomsday/tests/test_gloom/gloom/world/entitymap.h index eeedeee2dd..b00d0eed1c 100644 --- a/doomsday/tests/test_gloom/gloom/world/entitymap.h +++ b/doomsday/tests/test_gloom/gloom/world/entitymap.h @@ -21,7 +21,8 @@ #include #include -#include "entity.h" + +#include "gloom/world/entity.h" namespace gloom { diff --git a/doomsday/tests/test_gloom/gloom/world/environment.cpp b/doomsday/tests/test_gloom/gloom/world/environment.cpp index 7cc580761e..4366087b77 100644 --- a/doomsday/tests/test_gloom/gloom/world/environment.cpp +++ b/doomsday/tests/test_gloom/gloom/world/environment.cpp @@ -16,9 +16,9 @@ * http://www.gnu.org/licenses */ -#include "environment.h" -#include "world.h" -#include "../audio/audiosystem.h" +#include "gloom/world/environment.h" +#include "gloom/world/world.h" +#include "gloom/audio/audiosystem.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/world/map.cpp b/doomsday/tests/test_gloom/gloom/world/map.cpp index 7f78c9b8a4..c70f97ecd2 100644 --- a/doomsday/tests/test_gloom/gloom/world/map.cpp +++ b/doomsday/tests/test_gloom/gloom/world/map.cpp @@ -16,8 +16,7 @@ * http://www.gnu.org/licenses */ -#include "map.h" -#include "../geomath.h" +#include "gloom/world/map.h" #include diff --git a/doomsday/tests/test_gloom/gloom/world/map.h b/doomsday/tests/test_gloom/gloom/world/map.h index 8a33cf3d7e..780ba220ee 100644 --- a/doomsday/tests/test_gloom/gloom/world/map.h +++ b/doomsday/tests/test_gloom/gloom/world/map.h @@ -23,10 +23,11 @@ #include #include #include -#include "entity.h" -#include "../ident.h" -#include "../geomath.h" -#include "../render/polygon.h" + +#include "gloom/geo/geomath.h" +#include "gloom/geo/polygon.h" +#include "gloom/ident.h" +#include "gloom/world/entity.h" namespace gloom { diff --git a/doomsday/tests/test_gloom/gloom/world/user.cpp b/doomsday/tests/test_gloom/gloom/world/user.cpp index 4cc465fd89..636b3a92db 100644 --- a/doomsday/tests/test_gloom/gloom/world/user.cpp +++ b/doomsday/tests/test_gloom/gloom/world/user.cpp @@ -16,12 +16,10 @@ * http://www.gnu.org/licenses */ -#include "user.h" -#include "world.h" -#include "../../src/gloomapp.h" -#include "../audio/audiosystem.h" +#include "gloom/world/user.h" +#include "gloom/world/world.h" +#include "gloom/audio/audiosystem.h" -#include #include #include diff --git a/doomsday/tests/test_gloom/gloom/world/user.h b/doomsday/tests/test_gloom/gloom/world/user.h index 23a3543b9e..803ad740e8 100644 --- a/doomsday/tests/test_gloom/gloom/world/user.h +++ b/doomsday/tests/test_gloom/gloom/world/user.h @@ -16,8 +16,8 @@ * http://www.gnu.org/licenses */ -#ifndef USER_H -#define USER_H +#ifndef GLOOM_USER_H +#define GLOOM_USER_H #include #include @@ -76,4 +76,4 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(User::InputState) } // namespace gloom -#endif // USER_H +#endif // GLOOM_USER_H diff --git a/doomsday/tests/test_gloom/gloom/world/world.cpp b/doomsday/tests/test_gloom/gloom/world/world.cpp index 57a398c521..29d8a247e6 100644 --- a/doomsday/tests/test_gloom/gloom/world/world.cpp +++ b/doomsday/tests/test_gloom/gloom/world/world.cpp @@ -16,13 +16,7 @@ * http://www.gnu.org/licenses */ -#include "world.h" -#include "../../src/gloomapp.h" -#include -#include -#include -#include -#include +#include "gloom/world/world.h" using namespace de; diff --git a/doomsday/tests/test_gloom/gloom/world/world.h b/doomsday/tests/test_gloom/gloom/world/world.h index 7f8678c802..d288970987 100644 --- a/doomsday/tests/test_gloom/gloom/world/world.h +++ b/doomsday/tests/test_gloom/gloom/world/world.h @@ -21,7 +21,7 @@ #include #include -#include "../icamera.h" +#include "gloom/icamera.h" #include @@ -29,7 +29,7 @@ namespace gloom { class User; -class World +class World : public de::Deletable { public: World(); @@ -59,6 +59,8 @@ class World virtual float groundSurfaceHeight(de::Vector3f const &pos) const; virtual float ceilingHeight(de::Vector3f const &pos) const; + DENG2_CAST_METHODS() + public: DENG2_DEFINE_AUDIENCE(Ready, void worldReady(World &)) }; diff --git a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gbuffer.glsl b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gbuffer.glsl new file mode 100644 index 0000000000..3a2758a32a --- /dev/null +++ b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gbuffer.glsl @@ -0,0 +1,13 @@ +#ifndef GLOOM_GBUFFER_H +#define GLOOM_GBUFFER_H + +layout (location = 1) out vec4 out_Normal; + +uniform mat3 uWorldToViewMatrix; + +void GBuffer_SetFragmentNormal(vec3 worldNormal) +{ + out_Normal = vec4(normalize(uWorldToViewMatrix * worldNormal) * 0.5 + vec3(0.5), 1.0); +} + +#endif // GLOOM_GBUFFER_H diff --git a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gloom.dei b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gloom.dei index 07a42810f6..d149d9d250 100644 --- a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gloom.dei +++ b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/gloom.dei @@ -3,4 +3,31 @@ group gloom { path.vertex = "surface.vsh" path.fragment = "surface.fsh" } + shader finalize { + vertex = " + uniform mat4 uMvpMatrix; + DENG_ATTRIB vec4 aVertex; + DENG_ATTRIB vec2 aUV; + DENG_VAR vec2 vUV; + void main(void) { + gl_Position = uMvpMatrix * aVertex; + vUV = aUV; + } + " + fragment = " + uniform sampler2D uGBufferAlbedo; + uniform sampler2D uGBufferNormal; + uniform sampler2D uGBufferDepth; + uniform int uDebugMode; + DENG_VAR vec2 vUV; + void main(void) { + if (uDebugMode == 0) { + out_FragColor = texture(uGBufferAlbedo, vUV); + } + else if (uDebugMode == 1) { + out_FragColor = texture(uGBufferNormal, vUV); + } + } + " + } } diff --git a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/model.dei b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/model.dei index b8212ea7b2..4518996984 100644 --- a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/model.dei +++ b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/model.dei @@ -38,6 +38,8 @@ shader gloom.entity { #include.fragment fragment = " + #include 'gbuffer.glsl' + uniform sampler2D uTex; //uniform vec4 uFog; // RGB, max.distance //uniform vec3 uLightDir; @@ -56,5 +58,6 @@ shader gloom.entity { //gl_FragColor = mixFog(color, vFogColor) * vInstanceColor; out_FragColor = color * vInstanceColor; + GBuffer_SetFragmentNormal(vNormal); }" } diff --git a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/surface.fsh b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/surface.fsh index 985a5ca691..78137b83f9 100644 --- a/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/surface.fsh +++ b/doomsday/tests/test_gloom/net.dengine.gloom.pack/shaders/surface.fsh @@ -1,4 +1,5 @@ -#include 'miplevel.glsl' +#include "miplevel.glsl" +#include "gbuffer.glsl" #line 3 @@ -27,9 +28,9 @@ void main(void) { vec4 color = textureLod(uTex, uv, mipLevel(normUV, texelSize.xy) - 0.5); if (color.a < 0.005) { - out_FragColor = vec4(1.0, 0.0, 1.0, 1.0); - return; + discard; } out_FragColor = color; + GBuffer_SetFragmentNormal(vNormal); } diff --git a/doomsday/tests/test_gloom/src/editor.cpp b/doomsday/tests/test_gloom/src/editor.cpp index 7b7a1b48d3..1c1f9d9a76 100644 --- a/doomsday/tests/test_gloom/src/editor.cpp +++ b/doomsday/tests/test_gloom/src/editor.cpp @@ -18,7 +18,7 @@ #include "editor.h" #include "../src/gloomapp.h" -#include "../gloom/geomath.h" +#include "gloom/geo/geomath.h" #include diff --git a/doomsday/tests/test_gloom/src/editor.h b/doomsday/tests/test_gloom/src/editor.h index 190f308b49..6aee2cb77e 100644 --- a/doomsday/tests/test_gloom/src/editor.h +++ b/doomsday/tests/test_gloom/src/editor.h @@ -20,7 +20,7 @@ #define GLOOM_EDITOR_H #include -#include "../gloom/world/map.h" +#include "gloom/world/map.h" class Editor : public QWidget { diff --git a/doomsday/tests/test_gloom/src/gloomapp.cpp b/doomsday/tests/test_gloom/src/gloomapp.cpp index c1ddd5c62f..c5eb2a7f76 100644 --- a/doomsday/tests/test_gloom/src/gloomapp.cpp +++ b/doomsday/tests/test_gloom/src/gloomapp.cpp @@ -33,11 +33,11 @@ using namespace gloom; DENG2_PIMPL(GloomApp) { + ImageBank images; std::unique_ptr editor; std::unique_ptr winSys; std::unique_ptr audioSys; - ImageBank images; - GloomWorld world; + std::unique_ptr world; Impl(Public *i) : Base(i) {} @@ -46,7 +46,9 @@ DENG2_PIMPL(GloomApp) // Windows will be closed; OpenGL context will be gone. // Deinitalize everything. winSys->main().glActivate(); - world.glDeinit(); + world->glDeinit(); + world.reset(); + self().glDeinit(); } @@ -72,6 +74,8 @@ GloomApp::GloomApp(int &argc, char **argv) void GloomApp::initialize() { + d->world.reset(new GloomWorld); + // Set up the editor. { d->editor.reset(new Editor()); @@ -80,7 +84,7 @@ void GloomApp::initialize() connect(d->editor.get(), &Editor::buildMapRequested, [this]() { AppWindowSystem::main().glActivate(); - d->world.setMap(d->editor->map()); + d->world->setMap(d->editor->map()); }); } @@ -109,7 +113,7 @@ void GloomApp::initialize() // Create the window. MainWindow *win = d->winSys->newWindow("main"); - win->root().find("gloomwidget")->as().setWorld(&d->world); + win->root().find("gloomwidget")->as().setWorld(d->world.get()); scriptSystem().importModule("bootstrap"); win->show(); diff --git a/doomsday/tests/test_gloom/src/gloomapp.h b/doomsday/tests/test_gloom/src/gloomapp.h index f91219fee7..798fc1ee94 100644 --- a/doomsday/tests/test_gloom/src/gloomapp.h +++ b/doomsday/tests/test_gloom/src/gloomapp.h @@ -21,7 +21,7 @@ #include #include -#include "../gloom/audio/audiosystem.h" +#include "gloom/audio/audiosystem.h" #include "appwindowsystem.h" #include