Convert visual layers to scene nodes.
This commit is contained in:
parent
798cb365d7
commit
3e53bd9e00
64 changed files with 863 additions and 551 deletions
|
@ -12,7 +12,6 @@
|
|||
DrawingContext::DrawingContext(DrawingSurface* surface, FontsManager* fontsManager, DrawingMode requestedDrawingMode)
|
||||
: mSurface(surface),
|
||||
mDrawingMode(requestedDrawingMode),
|
||||
mScene(std::make_unique<Scene>()),
|
||||
mFontsManager(fontsManager)
|
||||
{
|
||||
mPainter = PainterFactory::Create(mDrawingMode);
|
||||
|
@ -23,11 +22,6 @@ std::unique_ptr<DrawingContext> DrawingContext::Create(DrawingSurface* surface,
|
|||
return std::make_unique<DrawingContext>(surface, fontsManager, requestedDrawingMode);
|
||||
}
|
||||
|
||||
Scene* DrawingContext::getScene() const
|
||||
{
|
||||
return mScene.get();
|
||||
}
|
||||
|
||||
DrawingSurface* DrawingContext::getSurface() const
|
||||
{
|
||||
return mSurface;
|
||||
|
@ -40,6 +34,10 @@ FontsManager* DrawingContext::getFontsManager() const
|
|||
|
||||
void DrawingContext::paint()
|
||||
{
|
||||
mScene->update(mFontsManager, mDrawingMode == DrawingMode::RASTER ? mSurface->getImage() : nullptr);
|
||||
if (mDrawingMode == DrawingMode::GRAPH)
|
||||
{
|
||||
mSurface->getScene()->update(mFontsManager);
|
||||
}
|
||||
|
||||
mPainter->paint(this);
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
class Scene;
|
||||
class AbstractPainter;
|
||||
class DrawingSurface;
|
||||
class FontsManager;
|
||||
|
@ -21,8 +20,6 @@ public:
|
|||
|
||||
static std::unique_ptr<DrawingContext> Create(DrawingSurface* surface, FontsManager* fontsManager, DrawingMode requestedDrawingMode);
|
||||
|
||||
Scene* getScene() const;
|
||||
|
||||
DrawingSurface* getSurface() const;
|
||||
|
||||
FontsManager* getFontsManager() const;
|
||||
|
@ -33,7 +30,7 @@ private:
|
|||
DrawingMode mDrawingMode;
|
||||
FontsManager* mFontsManager{nullptr};
|
||||
DrawingSurface* mSurface{nullptr};
|
||||
std::unique_ptr<Scene> mScene;
|
||||
|
||||
std::unique_ptr<AbstractPainter> mPainter;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,14 @@
|
|||
#include "DrawingSurface.h"
|
||||
|
||||
#include "Image.h"
|
||||
#include "Scene.h"
|
||||
|
||||
#include "RootNode.h"
|
||||
|
||||
DrawingSurface::DrawingSurface()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
std::unique_ptr<DrawingSurface> DrawingSurface::Create()
|
||||
{
|
||||
|
@ -23,6 +31,15 @@ unsigned DrawingSurface::getHeight() const
|
|||
return mHeight;
|
||||
}
|
||||
|
||||
Scene* DrawingSurface::getScene()
|
||||
{
|
||||
if (!mScene)
|
||||
{
|
||||
mScene = std::make_unique<Scene>();
|
||||
}
|
||||
return mScene.get();
|
||||
}
|
||||
|
||||
Image<unsigned char>* DrawingSurface::getImage()
|
||||
{
|
||||
if (!mBackingImage)
|
||||
|
|
|
@ -2,13 +2,15 @@
|
|||
|
||||
#include <memory>
|
||||
|
||||
class Scene;
|
||||
|
||||
template<typename T>
|
||||
class Image;
|
||||
|
||||
class DrawingSurface
|
||||
{
|
||||
public:
|
||||
DrawingSurface() = default;
|
||||
DrawingSurface();
|
||||
virtual ~DrawingSurface() = default;
|
||||
|
||||
static std::unique_ptr<DrawingSurface> Create();
|
||||
|
@ -21,8 +23,11 @@ public:
|
|||
|
||||
Image<unsigned char>* getImage();
|
||||
|
||||
Scene* getScene();
|
||||
|
||||
protected:
|
||||
unsigned mWidth = 0;
|
||||
unsigned mHeight = 0;
|
||||
std::unique_ptr<Scene> mScene;
|
||||
std::unique_ptr<Image<unsigned char> > mBackingImage;
|
||||
};
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "DrawingContext.h"
|
||||
#include "DrawingSurface.h"
|
||||
#include "SceneModel.h"
|
||||
#include "TriMesh.h"
|
||||
|
||||
#include "OpenGlShaderProgram.h"
|
||||
|
@ -64,12 +65,12 @@ void OpenGlMeshPainter::paint(const std::vector<float>& verts, const std::vector
|
|||
int vertexColorLocation = glGetUniformLocation(mShaderProgram->getHandle(), "ourColor");
|
||||
glUniform4f(vertexColorLocation, float(color[0]), float(color[1]), float(color[2]), float(color[3]));
|
||||
|
||||
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void OpenGlMeshPainter::paint(TriMesh* mesh, DrawingContext* context)
|
||||
void OpenGlMeshPainter::paint(SceneModel* model, DrawingContext* context)
|
||||
{
|
||||
if (!mShaderProgram)
|
||||
{
|
||||
|
@ -85,27 +86,29 @@ void OpenGlMeshPainter::paint(TriMesh* mesh, DrawingContext* context)
|
|||
const auto width = float(surface->getWidth());
|
||||
const auto height = float(surface->getHeight());
|
||||
|
||||
auto mesh = dynamic_cast<TriMesh*>(model->getMesh());
|
||||
|
||||
auto transform = model->getTransform();
|
||||
|
||||
auto vertices = mesh->getVerticesFlat<float>();
|
||||
for (std::size_t idx = 0; idx<vertices.size(); idx++)
|
||||
{
|
||||
if (idx % 3 == 0)
|
||||
{
|
||||
vertices[idx] = 2*vertices[idx]/width - 1.0;
|
||||
auto x = vertices[idx]*transform.getScaleX() + transform.getLocation().getX();
|
||||
vertices[idx] = 2*x/width - 1.0;
|
||||
}
|
||||
else if(idx%3 == 1)
|
||||
{
|
||||
vertices[idx] = 1.0 - 2*vertices[idx]/height;
|
||||
auto y = vertices[idx]*transform.getScaleY() + transform.getLocation().getY();
|
||||
vertices[idx] = 1.0 - 2*y/height;
|
||||
}
|
||||
}
|
||||
|
||||
const auto indices = mesh->getFaceNodeIds();
|
||||
|
||||
std::vector<float> color(4, 1.0f);
|
||||
if (mesh->hasVectorAttribute("Color"))
|
||||
{
|
||||
auto mesh_color = mesh->getVectorAttribute("Color");
|
||||
color = {float(mesh_color[0]), float(mesh_color[1]), float(mesh_color[2]), float(mesh_color[3])};
|
||||
}
|
||||
auto model_color = model->getColor().getAsVectorDouble();
|
||||
std::vector<float> color = {float(model_color[0]), float(model_color[1]), float(model_color[2]), float(model_color[3])};
|
||||
|
||||
paint(vertices, indices, color);
|
||||
}
|
||||
|
|
|
@ -5,14 +5,14 @@
|
|||
|
||||
class DrawingContext;
|
||||
class OpenGlShaderProgram;
|
||||
class TriMesh;
|
||||
class SceneModel;
|
||||
|
||||
class OpenGlMeshPainter
|
||||
{
|
||||
public:
|
||||
OpenGlMeshPainter();
|
||||
|
||||
void paint(TriMesh* mesh, DrawingContext* context);
|
||||
void paint(SceneModel* model, DrawingContext* context);
|
||||
|
||||
private:
|
||||
void initializeShader();
|
||||
|
|
|
@ -3,6 +3,9 @@
|
|||
#include "DrawingContext.h"
|
||||
#include "DrawingSurface.h"
|
||||
#include "Scene.h"
|
||||
#include "SceneItem.h"
|
||||
#include "SceneModel.h"
|
||||
#include "SceneText.h"
|
||||
|
||||
#include "TriMesh.h"
|
||||
|
||||
|
@ -51,18 +54,19 @@ void OpenGlPainter::paint(DrawingContext* context)
|
|||
glClearColor(0.5, 0.5, 1.0, 0.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
const auto num_mesh = context->getScene()->getNumMeshes();
|
||||
for (std::size_t idx=0 ; idx< num_mesh; idx++)
|
||||
for(unsigned idx=0; idx<context->getSurface()->getScene()->getNumItems(); idx++)
|
||||
{
|
||||
auto mesh = context->getScene()->getMesh(idx);
|
||||
mMeshPainter->paint(mesh, context);
|
||||
auto scene_item = context->getSurface()->getScene()->getItem(idx);
|
||||
if (scene_item->getType() == SceneItem::Type::MODEL)
|
||||
{
|
||||
mMeshPainter->paint(dynamic_cast<SceneModel*>(scene_item), context);
|
||||
}
|
||||
else
|
||||
{
|
||||
mTextPainter->paint(dynamic_cast<SceneText*>(scene_item), context);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto text_data = context->getScene()->getTextData();
|
||||
for (const auto& text_item : context->getScene()->getTextData())
|
||||
{
|
||||
mTextPainter->paint(text_item, context);
|
||||
break;
|
||||
}
|
||||
glFlush();
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include "OpenGlShaderProgram.h"
|
||||
#include "TextData.h"
|
||||
|
||||
#include "SceneText.h"
|
||||
|
||||
#include "File.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
|
@ -69,7 +71,7 @@ void OpenGlTextPainter::initializeBuffers()
|
|||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context)
|
||||
void OpenGlTextPainter::paint(SceneText* text, DrawingContext* context)
|
||||
{
|
||||
if (!mShaderProgram)
|
||||
{
|
||||
|
@ -81,12 +83,15 @@ void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context)
|
|||
initializeBuffers();
|
||||
}
|
||||
|
||||
initializeTextures(textData, context);
|
||||
auto text_data = text->getTextData();
|
||||
|
||||
initializeTextures(text_data, context);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
glUseProgram(mShaderProgram->getHandle());
|
||||
|
||||
glUniform3f(glGetUniformLocation(mShaderProgram->getHandle(), "textColor"), 0.0, 0.0, 0.0);
|
||||
|
||||
const auto width = float(context->getSurface()->getWidth());
|
||||
|
@ -97,9 +102,11 @@ void OpenGlTextPainter::paint(const TextData& textData, DrawingContext* context)
|
|||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindVertexArray(mVertexArray);
|
||||
|
||||
float x = textData.mLocation.GetX();
|
||||
const float y = height - textData.mLocation.GetY();
|
||||
for (auto c : textData.mContent)
|
||||
auto transform = text->getTransform();
|
||||
|
||||
float x = transform.getLocation().getX();
|
||||
const float y = height - transform.getLocation().getY();
|
||||
for (auto c : text_data.mContent)
|
||||
{
|
||||
auto texture = mFontTextures[c].get();
|
||||
|
||||
|
|
|
@ -8,13 +8,14 @@ class OpenGlFontTexture;
|
|||
class OpenGlShaderProgram;
|
||||
|
||||
class TextData;
|
||||
class SceneText;
|
||||
|
||||
class OpenGlTextPainter
|
||||
{
|
||||
public:
|
||||
OpenGlTextPainter();
|
||||
|
||||
void paint(const TextData& textData, DrawingContext* context);
|
||||
void paint(SceneText* text, DrawingContext* context);
|
||||
|
||||
private:
|
||||
void initializeShader();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue