fix propsBuffer & introduce lastProps
This commit is contained in:
parent
1e4588357d
commit
9a7b3edc9e
6 changed files with 71 additions and 55 deletions
|
@ -19,12 +19,6 @@ void GPUFontLayer::setup(const LayerSettings & settings){
|
|||
}
|
||||
|
||||
void GPUFontLayer::update(){
|
||||
if(propsBuffer.size() > 0){
|
||||
color = glm::vec4(propsBuffer[0].color[0],
|
||||
propsBuffer[0].color[1],
|
||||
propsBuffer[0].color[2],
|
||||
propsBuffer[0].color[3]);
|
||||
}
|
||||
}
|
||||
|
||||
void GPUFontLayer::draw(glm::vec3 position){
|
||||
|
@ -68,8 +62,8 @@ void GPUFontLayer::setProps(const Props & props){
|
|||
OFX_PROFILER_FUNCTION();
|
||||
bool propsBufferEmpty = propsBuffer.size() == 0;
|
||||
bool setAppearanceAlready = false;
|
||||
if(propsBufferEmpty || props.text != propsBuffer[0].text
|
||||
|| propsBuffer[0].fontVariations != props.fontVariations){
|
||||
if(propsBufferEmpty || lastProps.text != props.text
|
||||
|| lastProps.fontVariations != props.fontVariations){
|
||||
setAppearanceAlready = true;
|
||||
OFX_PROFILER_SCOPE("variations");
|
||||
setDirtyDirty(true);
|
||||
|
@ -85,10 +79,7 @@ void GPUFontLayer::setProps(const Props & props){
|
|||
ofxGPUFont::GlyphAppearance glyphAppearance;
|
||||
glyphIdentity.charcode = ofxGPUFont::decodeCharcode(&c);
|
||||
glyphAppearance.charcode = glyphIdentity.charcode;
|
||||
glyphAppearance.color.r = vProps.color[0];
|
||||
glyphAppearance.color.g = vProps.color[1];
|
||||
glyphAppearance.color.b = vProps.color[2];
|
||||
glyphAppearance.color.a = vProps.color[3];
|
||||
glyphAppearance.color = vProps.color;
|
||||
glyphAppearance.fontSize_px = vProps.fontSize_px;
|
||||
for(const auto & fv : vProps.fontVariations){
|
||||
glyphIdentity.coords.push_back(
|
||||
|
@ -103,34 +94,35 @@ void GPUFontLayer::setProps(const Props & props){
|
|||
}
|
||||
}
|
||||
if(!setAppearanceAlready
|
||||
&& !propsBufferEmpty
|
||||
&& (propsBuffer[0].fontSize_px != props.fontSize_px
|
||||
|| propsBuffer[0].color != props.color)){
|
||||
&& (lastProps.fontSize_px != props.fontSize_px
|
||||
|| lastProps.color != props.color)){
|
||||
for(int i = 0; i < props.text.size(); i++){
|
||||
const Props & vProps = getProps(i * props.letterDelay);
|
||||
const Props & vProps = propsBufferEmpty ? props : getProps(i * props.letterDelay);
|
||||
ofxGPUFont::GlyphAppearance & glyphAppearance = variationTextAppearance[i];
|
||||
glyphAppearance.fontSize_px = vProps.fontSize_px;
|
||||
variationTextAppearance[i].color.r = vProps.color[0];
|
||||
variationTextAppearance[i].color.g = vProps.color[1];
|
||||
variationTextAppearance[i].color.b = vProps.color[2];
|
||||
variationTextAppearance[i].color.a = vProps.color[3];
|
||||
variationTextAppearance[i].color = vProps.color;
|
||||
}
|
||||
}
|
||||
if(!propsBufferEmpty && props.fontPath != propsBuffer[0].fontPath){
|
||||
if(lastProps.fontPath != props.fontPath){
|
||||
notHappyWithMom = true;
|
||||
}
|
||||
|
||||
while(propsBuffer.size() > max(0, int(props.letterDelay * 30 * props.text.size()))){
|
||||
int maxPropsBufferSize = max(0, int(props.letterDelay * settings.letterDelayRatio * props.text.size()));
|
||||
if(maxPropsBufferSize > 0){
|
||||
propsBuffer.push_front(props);
|
||||
}
|
||||
while(propsBuffer.size() > maxPropsBufferSize){
|
||||
propsBuffer.pop_back();
|
||||
}
|
||||
propsBuffer.push_front(props);
|
||||
lastProps = props;
|
||||
}
|
||||
const Layer::Props & GPUFontLayer::getProps(float delay) const {
|
||||
int index = max(0, min(int(propsBuffer.size() - 1), int(delay * 30)));
|
||||
const Layer::Props & GPUFontLayer::getProps(float delay_seconds) const {
|
||||
if(delay_seconds != 0 && propsBuffer.size() > 0){
|
||||
int index = max(0, min(int(propsBuffer.size() - 1), int(delay_seconds * settings.letterDelayRatio)));
|
||||
return propsBuffer[index]; // gets newest
|
||||
}
|
||||
const glm::vec4 & GPUFontLayer::getColor() const {
|
||||
return color;
|
||||
}else{
|
||||
return lastProps;
|
||||
}
|
||||
}
|
||||
ofNode & GPUFontLayer::getOuterNode(){
|
||||
return outerNode;
|
||||
|
|
|
@ -24,7 +24,6 @@ class GPUFontLayer : public Layer {
|
|||
ofxVariableLab::FontVariation fontVariation = ofxVariableLab::FontVariation()) override;
|
||||
void setProps(const Props & props) override;
|
||||
const Props & getProps(float delay = 0) const override;
|
||||
const glm::vec4 & getColor() const;
|
||||
void clearPropsBuffer() override;
|
||||
void setId(const LayerID & id) override;
|
||||
const LayerID & getId() override;
|
||||
|
@ -61,10 +60,10 @@ class GPUFontLayer : public Layer {
|
|||
|
||||
private:
|
||||
std::deque <Props> propsBuffer;
|
||||
Props lastProps;
|
||||
ComboIdentifier momsComboIdentifier;
|
||||
bool notHappyWithMom = false;
|
||||
LayerType type = GPUFONT;
|
||||
glm::vec4 color;
|
||||
ofNode outerNode;
|
||||
ofNode innerNode;
|
||||
int letterDelayBufferSize = 0;
|
||||
|
|
35
src/Layer.h
35
src/Layer.h
|
@ -8,12 +8,13 @@
|
|||
#include "ofxMsdfgen.h"
|
||||
#include "Utils.h"
|
||||
#include <memory>
|
||||
#include <sstream>
|
||||
|
||||
namespace ofxVariableLab {
|
||||
|
||||
struct LayerSettings {
|
||||
uint32_t maxBufferSize = 100;
|
||||
VFlipBehaviour vFlipBehaviour = V_FLIP_ONCE_AUTO;
|
||||
float letterDelayRatio = 30.0f; //
|
||||
};
|
||||
|
||||
class Layer {
|
||||
|
@ -30,7 +31,7 @@ class Layer {
|
|||
float y = 200;
|
||||
float rotation = 0;
|
||||
float fontSize_px = 42;
|
||||
std::array <float, 4> color;
|
||||
std::array <float, 4> color = {0, 0, 0, 1};
|
||||
bool mirror_x = false;
|
||||
float mirror_x_distance = 0;
|
||||
bool mirror_y = false;
|
||||
|
@ -52,11 +53,40 @@ class Layer {
|
|||
//mirror_y,
|
||||
//mirror_y_distance,
|
||||
//letterDelay,
|
||||
//transformOrigin,
|
||||
//fontVariations,
|
||||
//text,
|
||||
//fontPath)
|
||||
};
|
||||
|
||||
static std::string asString(const ofxVariableLab::Layer::Props & props){
|
||||
stringstream s;
|
||||
s << "asString::props:" << endl
|
||||
<< "\tx:" << ofToString(props.x) << endl
|
||||
<< "\ty:" << ofToString(props.y) << endl
|
||||
<< "\trotation:" << ofToString(props.rotation) << endl
|
||||
<< "\tfontSize_px:" << ofToString(props.fontSize_px) << endl
|
||||
<< "\tcolor: ["
|
||||
<< ofToString(props.color[0]) << ","
|
||||
<< ofToString(props.color[1]) << ","
|
||||
<< ofToString(props.color[2]) << ","
|
||||
<< ofToString(props.color[3]) << "]"
|
||||
<< endl
|
||||
<< "\tmirror_x:" << ofToString(props.mirror_x) << endl
|
||||
<< "\tmirror_x_distance:" << ofToString(props.mirror_x_distance) << endl
|
||||
<< "\tmirror_y:" << ofToString(props.mirror_y) << endl
|
||||
<< "\tmirror_y_distance:" << ofToString(props.mirror_y_distance) << endl
|
||||
<< "\tletterDelay:" << ofToString(props.letterDelay) << endl
|
||||
<< "\ttransformOrigin:" << ofToString(props.transformOrigin) << endl;
|
||||
for(const auto & fv : props.fontVariations){
|
||||
s << "\tfontVariations (" << fv.name << "):" << ofToString(fv.value) << endl;
|
||||
}
|
||||
s << "\ttext: " << props.text << endl
|
||||
<< "\tfontPath: " << props.fontPath << endl
|
||||
;
|
||||
return s.str();
|
||||
}
|
||||
|
||||
virtual void setup(const LayerSettings & settings = LayerSettings()) = 0;
|
||||
virtual void update() = 0;
|
||||
virtual void draw(glm::vec3 position = glm::vec3(0, 0, 0)) = 0;
|
||||
|
@ -68,7 +98,6 @@ class Layer {
|
|||
ofxVariableLab::FontVariation fontVariation = ofxVariableLab::FontVariation()) = 0;
|
||||
virtual void setProps(const Props & props) = 0;
|
||||
virtual const Props & getProps(float delay = 0) const = 0;
|
||||
virtual const glm::vec4 & getColor() const = 0;
|
||||
virtual void clearPropsBuffer() = 0;
|
||||
virtual void setId(const LayerID & id) = 0;
|
||||
virtual const LayerID & getId() = 0;
|
||||
|
|
|
@ -9,10 +9,6 @@
|
|||
namespace ofxVariableLab {
|
||||
|
||||
void LayerComposition::setup(){
|
||||
//auto combo = make_shared <GPUFontAtlasLayerCombo>();
|
||||
//ComboIdentifier comboIdentifier = {"lol", Layer::GPUFONT};
|
||||
//combo->setup(comboIdentifier);
|
||||
//atlasLayerCombos[comboIdentifier] = combo;
|
||||
}
|
||||
|
||||
void LayerComposition::update(){
|
||||
|
@ -28,7 +24,7 @@ void LayerComposition::update(){
|
|||
momIdentifier.type
|
||||
};
|
||||
cout << "ideal mom looks like this: " << l.second->getProps().fontPath
|
||||
<< (momIdentifier.type == LayerType::GPUFONT ? "gpufont" : "msdfgen")
|
||||
<< (momIdentifier.type == LayerType::GPUFONT ? " gpufont" : " msdfgen")
|
||||
<< endl;
|
||||
findOrCreateNewMomForLayer(l.second, idealMom);
|
||||
}
|
||||
|
|
|
@ -17,12 +17,6 @@ void MsdfLayer::setup(const LayerSettings & settings){
|
|||
}
|
||||
|
||||
void MsdfLayer::update(){
|
||||
if(propsBuffer.size() > 0){
|
||||
color = glm::vec4(propsBuffer[0].color[0],
|
||||
propsBuffer[0].color[1],
|
||||
propsBuffer[0].color[2],
|
||||
propsBuffer[0].color[3]);
|
||||
}
|
||||
}
|
||||
|
||||
void MsdfLayer::draw(glm::vec3 position){
|
||||
|
@ -319,16 +313,23 @@ void MsdfLayer::setProps(const Props & props){
|
|||
if(propsBuffer.size() == 0 || props.text != propsBuffer[0].text){
|
||||
setDirtyDirty(true);
|
||||
}
|
||||
while(propsBuffer.size() > max(0, int(settings.maxBufferSize - 1))){
|
||||
int maxPropsBufferSize = max(0, int(props.letterDelay * settings.letterDelayRatio * props.text.size()));
|
||||
cout << "maxPropsBufferSize: " << ofToString(maxPropsBufferSize) << endl;
|
||||
if(maxPropsBufferSize > 0){
|
||||
propsBuffer.push_front(props);
|
||||
}
|
||||
while(propsBuffer.size() > maxPropsBufferSize){
|
||||
propsBuffer.pop_back();
|
||||
}
|
||||
propsBuffer.push_front(props);
|
||||
lastProps = props;
|
||||
}
|
||||
const Layer::Props & MsdfLayer::getProps(float delay) const {
|
||||
return propsBuffer[0];
|
||||
}
|
||||
const glm::vec4 & MsdfLayer::getColor() const {
|
||||
return color;
|
||||
const Layer::Props & MsdfLayer::getProps(float delay_seconds) const {
|
||||
if(delay_seconds != 0 && propsBuffer.size() > 0){
|
||||
int index = max(0, min(int(propsBuffer.size() - 1), int(delay_seconds * settings.letterDelayRatio)));
|
||||
return propsBuffer[index]; // gets newest
|
||||
}else{
|
||||
return lastProps;
|
||||
}
|
||||
}
|
||||
void MsdfLayer::clearPropsBuffer(){
|
||||
propsBuffer.clear();
|
||||
|
|
|
@ -22,7 +22,6 @@ class MsdfLayer : public Layer {
|
|||
ofxVariableLab::FontVariation fontVariation = ofxVariableLab::FontVariation()) override;
|
||||
void setProps(const Props & props) override;
|
||||
const Props & getProps(float delay = 0) const override;
|
||||
const glm::vec4 & getColor() const;
|
||||
void clearPropsBuffer() override;
|
||||
void setId(const LayerID & id) override;
|
||||
const LayerID & getId() override;
|
||||
|
@ -45,7 +44,6 @@ class MsdfLayer : public Layer {
|
|||
shared_ptr <ofxMsdfgen::Atlas> atlas;
|
||||
|
||||
LayerSettings settings;
|
||||
std::deque <Props> propsBuffer;
|
||||
shared_ptr <ofShader> shader;
|
||||
/// \brief are props updated but not drawn yet
|
||||
bool isDirty = true;
|
||||
|
@ -54,10 +52,11 @@ class MsdfLayer : public Layer {
|
|||
VFlipState vFlip = V_FLIP_UNKNOWN;
|
||||
|
||||
private:
|
||||
Props lastProps;
|
||||
std::deque <Props> propsBuffer;
|
||||
bool notHappyWithMom = false;
|
||||
ComboIdentifier momsComboIdentifier;
|
||||
LayerType type = MSDFGEN;
|
||||
glm::vec4 color;
|
||||
ofNode outerNode;
|
||||
ofNode innerNode;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue