set uniforms of msdf-combo

This commit is contained in:
jrkb 2023-07-16 19:09:25 +02:00
parent 161b59ee17
commit c1d6d052be
6 changed files with 63 additions and 35 deletions

View file

@ -241,5 +241,18 @@ void LayerComposition::setVFlip(bool vFlip){
void LayerComposition::setLayerOrder(const vector <LayerID> & layerOrder){ void LayerComposition::setLayerOrder(const vector <LayerID> & layerOrder){
this->layerOrder = layerOrder; this->layerOrder = layerOrder;
} }
void LayerComposition::setMsdfUniform1fv(const vector <string> & names,
const vector <float> & values){
for(const auto & [identifier, layerCombo] : atlasLayerCombos){
if(identifier.type == LayerType::MSDFGEN){
auto combo = static_pointer_cast <MsdfAtlasLayerCombo>(layerCombo);
combo->getShader()->begin();
for(int i = 0; i < names.size(); i++){
combo->getShader()->setUniform1f(names[i], values[i]);
}
combo->getShader()->end();
}
}
}
} }

View file

@ -35,8 +35,9 @@ class LayerComposition {
shared_ptr <Layer> getLayer(const LayerID & layerID); shared_ptr <Layer> getLayer(const LayerID & layerID);
const unordered_map <ComboIdentifier, shared_ptr <AtlasLayerCombo> > & getAtlasLayerCombos() const; const unordered_map <ComboIdentifier, shared_ptr <AtlasLayerCombo> > & getAtlasLayerCombos() const;
void setVFlip(bool vFlip); void setVFlip(bool vFlip);
void setLayerOrder(const vector <LayerID> & layerOrder); void setLayerOrder(const vector <LayerID> & layerOrder);
void setMsdfUniform1fv(const vector <string> & names,
const vector <float> & values);
private: private:
VFlipState vFlipState = V_FLIP_UNKNOWN; VFlipState vFlipState = V_FLIP_UNKNOWN;
unordered_map <LayerID, shared_ptr <Layer> > layers; unordered_map <LayerID, shared_ptr <Layer> > layers;

View file

@ -6,9 +6,12 @@
#include "of3dGraphics.h" #include "of3dGraphics.h"
#include "ofFileUtils.h" #include "ofFileUtils.h"
#include "ofGraphics.h" #include "ofGraphics.h"
#include "ofUtils.h"
#include "ofxProfiler.h" #include "ofxProfiler.h"
#ifdef TARGET_EMSCRIPTEN
#include <GL/glext.h> #include <GL/glext.h>
#include <GLES3/gl3.h> #include <GLES3/gl3.h>
#endif
namespace ofxVariableLab { namespace ofxVariableLab {
@ -154,8 +157,8 @@ void MsdfAtlasLayerCombo::draw(bool fade){
for(const auto & layer : layers){ for(const auto & layer : layers){
elements += layer->nElements; elements += layer->nElements;
} }
//vertices.resize(elements * 4); vertices.reserve(elements * 4);
//indices.resize(elements * 6); indices.reserve(elements * 6);
vertices.clear(); vertices.clear();
indices.clear(); indices.clear();
int offset = 0; int offset = 0;
@ -230,4 +233,7 @@ const ofImage & MsdfAtlasLayerCombo::getAtlasImage(){
string MsdfAtlasLayerCombo::getAtlasImagePath(){ string MsdfAtlasLayerCombo::getAtlasImagePath(){
return atlas->getAtlasPath(); return atlas->getAtlasPath();
} }
shared_ptr <ofShader> MsdfAtlasLayerCombo::getShader(){
return msdfShader;
}
} }

View file

@ -3,6 +3,7 @@
#include "AtlasLayerCombo.h" #include "AtlasLayerCombo.h"
#include "MsdfLayer.h" #include "MsdfLayer.h"
#include "Utils.h" #include "Utils.h"
#include <memory>
namespace ofxVariableLab { namespace ofxVariableLab {
using BufferVertex = MsdfLayer::BufferVertex; using BufferVertex = MsdfLayer::BufferVertex;
@ -25,8 +26,8 @@ class MsdfAtlasLayerCombo : public AtlasLayerCombo {
void exit(); void exit();
const ofImage & getAtlasImage(); const ofImage & getAtlasImage();
string getAtlasImagePath(); string getAtlasImagePath();
shared_ptr <Layer> getLayer(); // TODO: is this used
shared_ptr <ofxMsdfgen::Atlas> atlas; shared_ptr <ofxMsdfgen::Atlas> atlas;
shared_ptr <ofShader> getShader();
private: private:
MsdfAtlasLayerComboSettings settings; MsdfAtlasLayerComboSettings settings;

View file

@ -376,8 +376,8 @@ bool MsdfLayer::collectCharacter(const char character,
glm::vec4 p2 = glm::vec4(w, h, 0, 1); glm::vec4 p2 = glm::vec4(w, h, 0, 1);
glm::vec4 p3 = glm::vec4(w, 0, 0, 1); glm::vec4 p3 = glm::vec4(w, 0, 0, 1);
vertices.reserve(nodes.size() * 4); //vertices.reserve(nodes.size() * 4);
indices.reserve(nodes.size() * 6); //indices.reserve(nodes.size() * 6);
for(int i = 0; i < nodes.size(); i++){ for(int i = 0; i < nodes.size(); i++){
const glm::vec4 & color = colors[i]; const glm::vec4 & color = colors[i];
ofNode & node = nodes[i]; ofNode & node = nodes[i];
@ -387,37 +387,42 @@ bool MsdfLayer::collectCharacter(const char character,
//glm::vec4 p3 = node.getGlobalTransformMatrix() * glm::vec4(w, 0, 0, 1); //glm::vec4 p3 = node.getGlobalTransformMatrix() * glm::vec4(w, 0, 0, 1);
glm::mat4 globalTransform = node.getGlobalTransformMatrix(); glm::mat4 globalTransform = node.getGlobalTransformMatrix();
//std::lock_guard <std::mutex> vm(vertices_mutex);
vertices_mutex.lock();
int32_t base = static_cast <int32_t>(vertices.size()); int32_t base = static_cast <int32_t>(vertices.size());
vertices.push_back(BufferVertex{ vertices.insert(vertices.end(), {
BufferVertex{
{p0.x, p0.y, p0.z, p0.w}, {p0.x, p0.y, p0.z, p0.w},
{uv0_a.x, uv0_a.y}, {uv0_a.x, uv0_a.y},
{uv0_b.x, uv0_b.y}, {uv0_b.x, uv0_b.y},
{color.r, color.g, color.b, color.a}, {color.r, color.g, color.b, color.a},
mix, globalTransform mix, globalTransform
}); },
vertices.push_back(BufferVertex{ BufferVertex{
{p1.x, p1.y, p1.z, p1.w}, {p1.x, p1.y, p1.z, p1.w},
{uv1_a.x, uv1_a.y}, {uv1_a.x, uv1_a.y},
{uv1_b.x, uv1_b.y}, {uv1_b.x, uv1_b.y},
{color.r, color.g, color.b, color.a}, {color.r, color.g, color.b, color.a},
mix, globalTransform mix, globalTransform
}); },
vertices.push_back(BufferVertex{ BufferVertex{
{p2.x, p2.y, p2.z, p2.w}, {p2.x, p2.y, p2.z, p2.w},
{uv2_a.x, uv2_a.y}, {uv2_a.x, uv2_a.y},
{uv2_b.x, uv2_b.y}, {uv2_b.x, uv2_b.y},
{color.r, color.g, color.b, color.a}, {color.r, color.g, color.b, color.a},
mix, globalTransform mix, globalTransform
}); },
vertices.push_back(BufferVertex{ BufferVertex{
{p3.x, p3.y, p3.z, p3.w}, {p3.x, p3.y, p3.z, p3.w},
{uv3_a.x, uv3_a.y}, {uv3_a.x, uv3_a.y},
{uv3_b.x, uv3_b.y}, {uv3_b.x, uv3_b.y},
{color.r, color.g, color.b, color.a}, {color.r, color.g, color.b, color.a},
mix, globalTransform mix, globalTransform
}
}); });
indices.insert(indices.end(), {base, base + 1, base + 2, base + 2, base + 3, base}); indices.insert(indices.end(), {base, base + 1, base + 2, base + 2, base + 3, base});
nElements++; nElements++;
vertices_mutex.unlock();
} }
return true; return true;
} }

View file

@ -101,5 +101,7 @@ class MsdfLayer : public Layer {
ofNode outerNode; ofNode outerNode;
ofNode innerNode; ofNode innerNode;
Layer::BoundingBox boundingBox; Layer::BoundingBox boundingBox;
std::mutex vertices_mutex;
std::mutex indices_mutex;
}; };
} }