Пример #1
0
Text::Text()
{
	score = 0;
	lr_increment = 5;
	level = 20;
	initializeFont();
	initializeLeftPanel();
	initializeRightPanel();
	lines_remain = lr_increment * level + level;
	lr_text.setString(formatString(lines_remain));
}
Пример #2
0
void Ibex::TextRenderer::precompileText(float x, float y, const std::vector<std::string> &lines, const std::vector<bool> &highlighted, int maxChars)
{
	if(!initialized) {
		initialized = true;
		loadProgram();
		initializeFont();
	}
	checkForErrors();

	vertices.clear();
	indices.clear();
    minX = minY = INT_MAX;
    maxX = maxY = INT_MIN;

	// assume orthographic projection with units = screen pixels, origin at top left
	int index = 0;
	int lineNum = (int)lines.size()-1;
	//for(std::string line : lines) {
    for(int i = 0; i < lines.size(); ++i) {
        std::string line = lines[i];
		if(maxChars > 0 && line.length() > maxChars) {
			line.resize(maxChars);
		}
        const GLfloat *color = (highlighted.size() > i && highlighted[i]) ? highlightedTextColor : textColor;
		x = 0;
		y = -lineNum * (ascent-descent+lineGap)*scale;
		unsigned char *text = (unsigned char *)line.data();
		while (*text) {
			if (*text >= 32 && *text < 128) {
				stbtt_aligned_quad q;
				stbtt_GetBakedQuad(cdata, 1024,256, *text-32, &x,&y,&q,1);

				// bottom right triangle
				vertices.push_back(q.x0);
				vertices.push_back((baseline-q.y0));
				vertices.push_back(0);
				vertices.push_back(q.s0);
				vertices.push_back(q.t0);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);

				vertices.push_back(q.x1);
				vertices.push_back((baseline-q.y0));
				vertices.push_back(0);
				vertices.push_back(q.s1);
				vertices.push_back(q.t0);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);

				vertices.push_back(q.x1);
				vertices.push_back((baseline-q.y1));
				vertices.push_back(0);
				vertices.push_back(q.s1);
				vertices.push_back(q.t1);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);

				// top left triangle
				vertices.push_back(q.x0);
				vertices.push_back((baseline-q.y0));
				vertices.push_back(0);
				vertices.push_back(q.s0);
				vertices.push_back(q.t0);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);
                
				vertices.push_back(q.x1);
				vertices.push_back((baseline-q.y1));
				vertices.push_back(0);
				vertices.push_back(q.s1);
				vertices.push_back(q.t1);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);

				vertices.push_back(q.x0);
				vertices.push_back((baseline-q.y1));
				vertices.push_back(0);
				vertices.push_back(q.s0);
				vertices.push_back(q.t1);
                vertices.push_back(color[0]);
                vertices.push_back(color[1]);
                vertices.push_back(color[2]);
                vertices.push_back(color[3]);

				minX = std::min(minX,std::min(q.x0,q.x1));
				maxX = std::max(maxX,std::max(q.x0,q.x1));
				minY = std::min(minY,std::min(baseline-q.y0,baseline-q.y1)+y);
				maxY = std::max(maxY,std::max(baseline-q.y0,baseline-q.y1));

				for(int i = 0; i < 6; ++i) {
					indices.push_back(index++);
				}
			}
			++text;
		}
		--lineNum;

		if(minX > maxX) std::swap(minX,maxX);
		if(minY > maxY) std::swap(minY,maxY);
	}

	if(vaoTextRenderer == 0) glGenVertexArrays(1,&vaoTextRenderer);
	if(!checkForErrors()) {
		exit(1);
	}

	glBindVertexArray(vaoTextRenderer);
	if(vboTextVertices == 0) glGenBuffers(1, &vboTextVertices);
	glBindBuffer(GL_ARRAY_BUFFER, vboTextVertices);
	glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);
	if(!checkForErrors()) {
		exit(1);
	}
	glEnableVertexAttribArray(IbexTextAttribLocations[0]);
	glVertexAttribPointer(IbexTextAttribLocations[0], 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, 0);
	glEnableVertexAttribArray(IbexTextAttribLocations[1]);
	glVertexAttribPointer(IbexTextAttribLocations[1], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, (GLvoid*) (sizeof(GLfloat)*3));
    glEnableVertexAttribArray(IbexTextAttribLocations[2]);
	glVertexAttribPointer(IbexTextAttribLocations[2], 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*9, (GLvoid*) (sizeof(GLfloat)*5));
	if(!checkForErrors()) {
		exit(1);
	}
	if(vboTextIndices == 0) glGenBuffers(1, &vboTextIndices);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboTextIndices);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLuint), indices.data(), GL_STATIC_DRAW);
	if(!checkForErrors()) {
		exit(1);
	}
    glBindVertexArray(0);


	//////////////////////////////////////////////////////////////////////////////
	static GLfloat IbexDisplayFlatVertices[] = {
		-1.0, -1.0, 0.0, 0, 1,
		1.0, -1.0, 0.0, 1, 1,
		1.0,  1.0, 0.0, 1, 0,
		-1.0,  1.0, 0.0, 0, 0
	};

	static GLushort IbexDisplayFlatIndices[] = {
		0, 2, 1,
		0, 3, 2
	};

    if(vaoTextTextureRenderer == 0) {
        if(vaoTextTextureRenderer == 0) glGenVertexArrays(1,&vaoTextTextureRenderer);
        if(!checkForErrors()) {
            exit(1);
        }

        glBindVertexArray(vaoTextTextureRenderer);
        if(vboTextTextureVertices == 0) glGenBuffers(1, &vboTextTextureVertices);
        glBindBuffer(GL_ARRAY_BUFFER, vboTextTextureVertices);
        glBufferData(GL_ARRAY_BUFFER, sizeof(IbexDisplayFlatVertices), IbexDisplayFlatVertices, GL_STATIC_DRAW);
        if(!checkForErrors()) {
            exit(1);
        }
        glEnableVertexAttribArray(IbexDisplayFlatAttribLocations[0]);
        glVertexAttribPointer(IbexDisplayFlatAttribLocations[0], 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, 0);
        glEnableVertexAttribArray(IbexDisplayFlatAttribLocations[2]);
        glVertexAttribPointer(IbexDisplayFlatAttribLocations[2], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*5, (GLvoid*) (sizeof(GLfloat) * 3));
        if(!checkForErrors()) {
            exit(1);
        }
        if(vboTextTextureIndices == 0) glGenBuffers(1, &vboTextTextureIndices);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboTextTextureIndices);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(IbexDisplayFlatIndices), IbexDisplayFlatIndices, GL_STATIC_DRAW);
        if(!checkForErrors()) {
            exit(1);
        }
        glBindVertexArray(0);
    }
}