Convert visual layers to scene nodes.

This commit is contained in:
James Grogan 2022-11-16 15:06:08 +00:00
parent 798cb365d7
commit 3e53bd9e00
64 changed files with 863 additions and 551 deletions

View file

@ -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);
}

View file

@ -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;
};

View file

@ -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)

View file

@ -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;
};

View file

@ -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);
}

View file

@ -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();

View file

@ -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();
}

View file

@ -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();

View file

@ -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();