rename gl variables for hopeful clarification

This commit is contained in:
jrkb 2023-04-26 16:20:58 +02:00
parent 0eab1db037
commit 351a9ac2ec

View file

@ -193,6 +193,27 @@ class Font {
float x0, y0, x1, y1, x2, y2; float x0, y0, x1, y1, x2, y2;
}; };
// keep this, just because I wrote it
// though, we don't need it as openGL takes care
// of managing the units
//
//static set <int> gl_texture_units;
//static set <int> gl_texture_units_freed;
//static int claimFreeTextureName(){
//if(gl_texture_units_freed.size() == 0){
//int unit = gl_texture_units.size();
//gl_texture_units.insert(unit);
//return unit;
//}else{
//auto unit_it = gl_texture_units_freed.begin();
//int unit = *unit_it;
//gl_texture_units.insert(unit);
//gl_texture_units_freed.erase(unit_it);
//return unit;
//}
//}
public: public:
struct BufferVertex { struct BufferVertex {
float x, y, u, v; float x, y, u, v;
@ -398,9 +419,9 @@ class Font {
// Otherwise, worldSize can be an arbitrary floating-point value. // Otherwise, worldSize can be an arbitrary floating-point value.
Font(FT_Face face, int gpuTextureOffset, float worldSize = 1.0f, bool hinting = false) : Font(FT_Face face, int gpuTextureOffset, float worldSize = 1.0f, bool hinting = false) :
face(face), face(face),
gpuTextureOffset(gpuTextureOffset), hinting(hinting),
worldSize(worldSize), worldSize(worldSize),
hinting(hinting){ gpuTextureOffset(gpuTextureOffset){
// TODO: modularize init, so we can initialize with settings and text // TODO: modularize init, so we can initialize with settings and text
if(hinting){ if(hinting){
@ -419,20 +440,37 @@ class Font {
emSize = face->units_per_EM; emSize = face->units_per_EM;
} }
//int amounters = 0;
//for(int i = 0; i < 1024; i++){
//testGL(10 + i);
//amounters = i + 1;
//cout << "added " << ofToString(amounters) << " LOL" << endl;
//bool hasError = false;
//GLenum err;
//while((err = glGetError()) != GL_NO_ERROR){
//hasError = true;
//// Process/log the error.
//}
//if(hasError){
//cout << "WHOOOPS" << endl;
//break;
//}
//}
glGenVertexArrays(1, &vao); glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo); glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo); glGenBuffers(1, &ebo);
#ifndef TARGET_OPENGLES #ifndef TARGET_OPENGLES
glGenTextures(1, &glyphTexture); glGenTextures(1, &glyphTextureName);
glGenTextures(1, &curveTexture); glGenTextures(1, &curveTextureName);
glGenBuffers(1, &glyphBuffer); glGenBuffers(1, &glyphBufferName);
glGenBuffers(1, &curveBuffer); glGenBuffers(1, &curveBufferName);
#else #else
glGenTextures(1, &glyphBuffer); glGenTextures(1, &glyphBufferName);
glGenTextures(1, &curveBuffer); glGenTextures(1, &curveBufferName);
#endif #endif
glBindVertexArray(vao); glBindVertexArray(vao);
@ -451,12 +489,12 @@ class Font {
uploadBuffers(); uploadBuffers();
#ifndef TARGET_OPENGLES #ifndef TARGET_OPENGLES
glBindTexture(GL_TEXTURE_BUFFER, glyphTexture); glBindTexture(GL_TEXTURE_BUFFER, glyphTextureName);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32I, glyphBuffer); glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32I, glyphBufferName);
glBindTexture(GL_TEXTURE_BUFFER, 0); glBindTexture(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_BUFFER, curveTexture); glBindTexture(GL_TEXTURE_BUFFER, curveTextureName);
glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, curveBuffer); glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, curveBufferName);
glBindTexture(GL_TEXTURE_BUFFER, 0); glBindTexture(GL_TEXTURE_BUFFER, 0);
#else #else
#endif #endif
@ -469,14 +507,14 @@ class Font {
glDeleteBuffers(1, &ebo); glDeleteBuffers(1, &ebo);
#ifndef TARGET_OPENGLES #ifndef TARGET_OPENGLES
glDeleteTextures(1, &glyphTexture); glDeleteTextures(1, &glyphTextureName);
glDeleteTextures(1, &curveTexture); glDeleteTextures(1, &curveTextureName);
glDeleteBuffers(1, &glyphBuffer); glDeleteBuffers(1, &glyphBufferName);
glDeleteBuffers(1, &curveBuffer); glDeleteBuffers(1, &curveBufferName);
#else #else
glDeleteTextures(1, &glyphBuffer); glDeleteTextures(1, &glyphBufferName);
glDeleteTextures(1, &curveBuffer); glDeleteTextures(1, &curveBufferName);
#endif #endif
FT_Done_Face(face); FT_Done_Face(face);
@ -590,24 +628,70 @@ class Font {
int calcTextureOffset(){ int calcTextureOffset(){
return gpuTextureOffset * 2; return gpuTextureOffset * 2;
} }
void testGL(GLuint texture = 10){
//int size = 0;
//glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);
//cout << "GL_MAX_TEXTURE_SIZE: " << ofToString(size) << endl;
//size = 0;
//glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &size);
//cout << "GL_MAX_ARRAY_TEXTURE_LAYERS: " << ofToString(size) << endl;
//size = 0;
GLsizei width = 16384;
GLsizei height = 1;
GLsizei layerCount = 4;
GLsizei mipLevelCount = 1;
// Read you texels here. In the current example, we have 2*2*2 = 8 texels, with each texel being 4 GLubytes.
GLubyte texels[layerCount][width * height];
for(int l = 0; l < layerCount; l++){
for(int i = 0; i < width * height; i++){
texels[l][i] = 127;
}
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
// Allocate the storage.
glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount);
// Upload pixel data.
// The first 0 refers to the mipmap level (level 0, since there's only 1)
// The following 2 zeroes refers to the x and y offsets in case you only want to specify a subrectangle.
// The final 0 refers to the layer index offset (we start from index 0 and have 2 levels).
// Altogether you can specify a 3D box subset of the overall texture, but only one mip level at a time.
for(int i = 0; i < (int)layerCount; i++){
//cout << "OFFSET " << ofToString(i) << endl;
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels[i]);
}
// Always set reasonable texture parameters
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
void uploadBuffers(){ void uploadBuffers(){
//cout << "bufferGlyphs.size(): " << bufferGlyphs.size() << endl; //cout << "bufferGlyphs.size(): " << bufferGlyphs.size() << endl;
//cout << "bufferCurves.size(): " << bufferCurves.size() << endl; //cout << "bufferCurves.size(): " << bufferCurves.size() << endl;
#ifndef TARGET_OPENGLES #ifndef TARGET_OPENGLES
glBindBuffer(GL_TEXTURE_BUFFER, glyphBuffer); glBindBuffer(GL_TEXTURE_BUFFER, glyphBufferName);
glBufferData(GL_TEXTURE_BUFFER, sizeof(BufferGlyph) * bufferGlyphs.size(), bufferGlyphs.data(), GL_STATIC_DRAW); glBufferData(GL_TEXTURE_BUFFER, sizeof(BufferGlyph) * bufferGlyphs.size(), bufferGlyphs.data(), GL_STATIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER, 0); glBindBuffer(GL_TEXTURE_BUFFER, 0);
glBindBuffer(GL_TEXTURE_BUFFER, curveBuffer); glBindBuffer(GL_TEXTURE_BUFFER, curveBufferName);
glBufferData(GL_TEXTURE_BUFFER, sizeof(BufferCurve) * bufferCurves.size(), bufferCurves.data(), GL_STATIC_DRAW); glBufferData(GL_TEXTURE_BUFFER, sizeof(BufferCurve) * bufferCurves.size(), bufferCurves.data(), GL_STATIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER, 0); glBindBuffer(GL_TEXTURE_BUFFER, 0);
#else #else
int size;
//glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &size);
//cout << "GL_MAX_SHADER_STORAGE_BLOCK_SIZE: " << ofToString(size) << endl;
glyphBufferUnit = 1;
curveBufferUnit = 2;
int bufferGlyphsSize = bufferGlyphs.size(); int bufferGlyphsSize = bufferGlyphs.size();
if(!isPowerOfTwo(bufferGlyphsSize)){ if(!isPowerOfTwo(bufferGlyphsSize)){
bufferGlyphsSize = calculateUpperPowerOfTwo(bufferGlyphsSize); bufferGlyphsSize = calculateUpperPowerOfTwo(bufferGlyphsSize);
} }
glActiveTexture(GL_TEXTURE3 + calcTextureOffset()); glActiveTexture(GL_TEXTURE0 + glyphBufferUnit);
glBindTexture(GL_TEXTURE_2D, glyphBuffer); glBindTexture(GL_TEXTURE_2D, glyphBufferName);
if(!initializedGlyphsBufferTexture){ if(!initializedGlyphsBufferTexture){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@ -633,8 +717,9 @@ class Font {
if(!isPowerOfTwo(bufferCurvesSize)){ if(!isPowerOfTwo(bufferCurvesSize)){
bufferCurvesSize = calculateUpperPowerOfTwo(bufferCurvesSize); bufferCurvesSize = calculateUpperPowerOfTwo(bufferCurvesSize);
} }
glActiveTexture(GL_TEXTURE4 + calcTextureOffset()); cout << "bufferCurvesSize: " << ofToString(bufferCurvesSize) << endl;
glBindTexture(GL_TEXTURE_2D, curveBuffer); glActiveTexture(GL_TEXTURE0 + curveBufferUnit);
glBindTexture(GL_TEXTURE_2D, curveBufferName);
if(!initializedCurvesBufferTexture){ if(!initializedCurvesBufferTexture){
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@ -884,25 +969,25 @@ class Font {
location = glGetUniformLocation(program, "curves"); location = glGetUniformLocation(program, "curves");
glUniform1i(location, 1); glUniform1i(location, 1);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_BUFFER, glyphTexture); glBindTexture(GL_TEXTURE_BUFFER, glyphTextureName);
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_BUFFER, curveTexture); glBindTexture(GL_TEXTURE_BUFFER, curveTextureName);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
#else #else
// Important! The GLint for the location needs to stick around // Important! The GLint for the location needs to stick around
// we cannot reuse a location as in Desktop for some reason // we cannot reuse a location as in Desktop for some reason
glyphBufferLocation = glGetUniformLocation(program, "glyphs"); glyphsUniformLocation = glGetUniformLocation(program, "glyphs");
glUniform1i(glyphBufferLocation, 3 + calcTextureOffset()); glUniform1i(glyphsUniformLocation, glyphBufferUnit);
curveBufferLocation = glGetUniformLocation(program, "curves"); curvesUniformLocation = glGetUniformLocation(program, "curves");
glUniform1i(curveBufferLocation, 4 + calcTextureOffset()); glUniform1i(curvesUniformLocation, curveBufferUnit);
glActiveTexture(GL_TEXTURE3 + calcTextureOffset()); glActiveTexture(GL_TEXTURE0 + glyphBufferUnit);
glBindTexture(GL_TEXTURE_2D, glyphBuffer); glBindTexture(GL_TEXTURE_2D, glyphBufferName);
glActiveTexture(GL_TEXTURE4 + calcTextureOffset()); glActiveTexture(GL_TEXTURE0 + curveBufferUnit);
glBindTexture(GL_TEXTURE_2D, curveBuffer); glBindTexture(GL_TEXTURE_2D, curveBufferName);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
#endif #endif
@ -1085,96 +1170,6 @@ class Font {
} }
} }
// NOTE: following only exists for nostalgic reason
//
//void collectVerticesAndIndices(const ofNode & node,
//const std::vector <GlyphIdentity> & variationText,
//std::vector <BufferVertex> & vertices,
//std::vector <int32_t> & indices,
//const glm::vec4 & color = glm::vec4(1),
//const bool vFlip = false,
//const float fontSize_px = 42){
//float advanceX = 0;
//float advanceY = 0;
//FT_UInt previous = 0;
//for(const GlyphIdentity & glyphIdentity : variationText){
//if(glyphIdentity.charcode == '\0'){
//break;
//}
//float letterFontSize_px = fontSize_px; // can be individual
//const uint32_t & charcode = glyphIdentity.charcode;
//if(charcode == '\r'){
//continue;
//}
//if(charcode == '\n' || charcode == 'n'){
//advanceX = 0;
//advanceY += ((float)face->height * fontSize_px) / (float)face->units_per_EM * worldSize;
//if(!vFlip){
//advanceY *= -1;
//}
//if(hinting){
//advanceY = std::round(advanceY);
//}
//continue;
//}
//auto glyphIt = glyphs.find(glyphIdentity);
//Glyph & glyph = (glyphIt == glyphs.end()) ? glyphs.begin()->second : glyphIt->second; // in case we have no glyph, draw first one?
//// NOTE: should we do this?
//if(previous != 0 && glyph.index != 0){
//FT_Vector kerning;
//FT_Error error = FT_Get_Kerning(face, previous, glyph.index, kerningMode, &kerning);
//if(!error){
//advanceX += ((float)kerning.x * fontSize_px) / emSize * worldSize;
//}
//}
//// Do not emit quad for empty glyphs (whitespace).
//if(glyph.curveCount){
//FT_Pos d = (FT_Pos)(emSize * dilation);
//float u0 = (float)(glyph.bearingX - d) / emSize;
//float v0 = (float)(glyph.bearingY - glyph.height - d) / emSize;
//float u1 = (float)(glyph.bearingX + glyph.width + d) / emSize;
//float v1 = (float)(glyph.bearingY + d) / emSize;
//float x0 = advanceX + u0 * worldSize * letterFontSize_px;
//float y0 = v0 * worldSize * letterFontSize_px;
//float x1 = advanceX + u1 * worldSize * letterFontSize_px;
//float y1 = v1 * worldSize * letterFontSize_px;
//if(vFlip){
//float _v = v0;
//v0 = v1;
//v1 = _v;
//y0 = -v0 * worldSize * letterFontSize_px;
//y1 = -v1 * worldSize * letterFontSize_px;
//}
//glm::vec4 p0 = node.getGlobalTransformMatrix() * glm::vec4(x0, y0 + advanceY, 0, 1);
//glm::vec4 p1 = node.getGlobalTransformMatrix() * glm::vec4(x1, y0 + advanceY, 0, 1);
//glm::vec4 p2 = node.getGlobalTransformMatrix() * glm::vec4(x1, y1 + advanceY, 0, 1);
//glm::vec4 p3 = node.getGlobalTransformMatrix() * glm::vec4(x0, y1 + advanceY, 0, 1);
//int32_t base = static_cast <int32_t>(vertices.size());
//vertices.push_back(BufferVertex{p0.x, p0.y, u0, v0, glyph.bufferIndex, color.r, color.g, color.b, color.a});
//vertices.push_back(BufferVertex{p1.x, p1.y, u1, v0, glyph.bufferIndex, color.r, color.g, color.b, color.a});
//vertices.push_back(BufferVertex{p2.x, p2.y, u1, v1, glyph.bufferIndex, color.r, color.g, color.b, color.a});
//vertices.push_back(BufferVertex{p3.x, p3.y, u0, v1, glyph.bufferIndex, color.r, color.g, color.b, color.a});
//indices.insert(indices.end(), {base, base + 1, base + 2, base + 2, base + 3, base});
//}
//advanceX += ((float)glyph.advance * letterFontSize_px) / emSize * worldSize;
//previous = glyph.index;
//}
//}
void draw(const std::vector <BufferVertex> & vertices, void draw(const std::vector <BufferVertex> & vertices,
const std::vector <int32_t> & indices){ const std::vector <int32_t> & indices){
glBindVertexArray(vao); glBindVertexArray(vao);
@ -1215,11 +1210,12 @@ class Font {
GLuint vao, vbo, ebo; GLuint vao, vbo, ebo;
#ifndef TARGET_OPENGLES #ifndef TARGET_OPENGLES
GLuint glyphTexture, curveTexture; GLuint glyphTextureName, curveTextureName;
#else #else
GLint glyphBufferLocation, curveBufferLocation; GLint glyphsUniformLocation, curvesUniformLocation;
#endif #endif
GLuint glyphBuffer, curveBuffer; GLuint glyphBufferName, curveBufferName;
GLuint glyphBufferUnit, curveBufferUnit;
std::vector <BufferGlyph> bufferGlyphs; std::vector <BufferGlyph> bufferGlyphs;
std::vector <BufferCurve> bufferCurves; std::vector <BufferCurve> bufferCurves;