Skip to content

Commit

Permalink
NWN: Display dialog boxes with experimental renderer
Browse files Browse the repository at this point in the history
Add support for displaying dialog boxes when using shader based
rendering.
  • Loading branch information
mirv-sillyfish authored and DrMcCoy committed Feb 21, 2019
1 parent 45ea343 commit 74da9bb
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
42 changes: 42 additions & 0 deletions src/engines/nwn/gui/ingame/dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
// TODO: Make dialog boxes resizeable and/or repositionable?
// TODO: Actually, in the original, the dialog boxes do resize themselves up to a point...

#include "glm/gtc/matrix_transform.hpp"

#include "src/common/util.h"
#include "src/common/configman.h"

Expand Down Expand Up @@ -53,6 +55,10 @@

#include "src/engines/nwn/gui/ingame/dialog.h"

#include "src/graphics/mesh/meshman.h"
#include "src/graphics/shader/surfaceman.h"
#include "src/graphics/shader/materialman.h"

static const float kDialogWidth = 350.0f;
static const float kDialogHeight = 254.0f;

Expand Down Expand Up @@ -96,6 +102,14 @@ DialogBox::DialogBox(float width, float height) :

_highlightedReply = _replyLines.end();
_pickedReply = _replies.end();

_shaderRenderableBackdrop.setMesh(MeshMan.getMesh("defaultMeshQuad"));
_shaderRenderableBackdrop.setSurface(SurfaceMan.getSurface("defaultSurface"), false);
_shaderRenderableBackdrop.setMaterial(MaterialMan.getMaterial("defaultBlack"));

_shaderRenderableEdge.setMesh(MeshMan.getMesh("defaultMeshQuad"));
_shaderRenderableEdge.setSurface(SurfaceMan.getSurface("defaultSurface"), false);
_shaderRenderableEdge.setMaterial(MaterialMan.getMaterial("defaultWhite"));
}

DialogBox::~DialogBox() {
Expand Down Expand Up @@ -539,6 +553,34 @@ void DialogBox::render(Graphics::RenderPass pass) {
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}

void DialogBox::renderImmediate(const glm::mat4 &parentTransform) {
glm::mat4 backdropTransform = parentTransform;
backdropTransform = glm::translate(backdropTransform, glm::vec3(_x, _y, 0.0f));
backdropTransform = glm::scale(backdropTransform, glm::vec3(_width, _height, 1.0f));

glm::mat4 topEdgeTransform = parentTransform;
topEdgeTransform = glm::translate(topEdgeTransform, glm::vec3(_x, _y + _height - 1.0f, 0.0f));
topEdgeTransform = glm::scale(topEdgeTransform, glm::vec3(_width, 1.0f, 1.0f));

glm::mat4 bottomEdgeTransform = parentTransform;
bottomEdgeTransform = glm::translate(bottomEdgeTransform, glm::vec3(_x, _y, 0.0f));
bottomEdgeTransform = glm::scale(bottomEdgeTransform, glm::vec3(_width, 1.0f, 1.0f));

glm::mat4 leftEdgeTransform = parentTransform;
leftEdgeTransform = glm::translate(leftEdgeTransform, glm::vec3(_x, _y, 0.0f));
leftEdgeTransform = glm::scale(leftEdgeTransform, glm::vec3(1.0f, _height, 1.0f));

glm::mat4 rightEdgeTransform = parentTransform;
rightEdgeTransform = glm::translate(rightEdgeTransform, glm::vec3(_x + _width - 1.0f, _y, 0.0f));
rightEdgeTransform = glm::scale(rightEdgeTransform, glm::vec3(1.0f, _height, 1.0f));

_shaderRenderableBackdrop.renderImmediate(backdropTransform);
_shaderRenderableEdge.renderImmediate(topEdgeTransform);
_shaderRenderableEdge.renderImmediate(bottomEdgeTransform);
_shaderRenderableEdge.renderImmediate(leftEdgeTransform);
_shaderRenderableEdge.renderImmediate(rightEdgeTransform);
}


Dialog::Dialog(const Common::UString &conv, Creature &pc, Object &obj,
Module &module, bool playHello) :
Expand Down
7 changes: 6 additions & 1 deletion src/engines/nwn/gui/ingame/dialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

#include "src/graphics/aurora/fonthandle.h"

#include "src/graphics/shader/shaderrenderable.h"

#include "src/engines/nwn/gui/gui.h"

namespace Common {
Expand Down Expand Up @@ -125,6 +127,8 @@ class DialogBox : public Graphics::GUIElement {
void calculateDistance();
void render(Graphics::RenderPass pass);

void renderImmediate(const glm::mat4 &parentTransform);

private:
/** A PC reply. */
struct Reply {
Expand Down Expand Up @@ -172,6 +176,8 @@ class DialogBox : public Graphics::GUIElement {
std::list<ReplyLine>::iterator _highlightedReply; ///< The currently highlighted reply.
std::list<Reply>::const_iterator _pickedReply; ///< The picked (clicked) reply.

Graphics::Shader::ShaderRenderable _shaderRenderableBackdrop;
Graphics::Shader::ShaderRenderable _shaderRenderableEdge;

void showEntry(); ///< Show the entry.
void hideEntry(); ///< Hide the entry.
Expand Down Expand Up @@ -222,7 +228,6 @@ class Dialog : public Events::Notifyable {

std::list<Events::Event> _eventQueue; ///< The event queue.


void updateBox(); ///< Update the box's contents.

Object *getSpeaker(); ///< Get the current speaker.
Expand Down

0 comments on commit 74da9bb

Please sign in to comment.