You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.6 KiB
132 lines
4.6 KiB
/**
|
|
********************************************************************************
|
|
* Copyright (C) 2024 NEXTCHIP Inc. All rights reserved.
|
|
* This software is the confidential and proprietary information of
|
|
* NEXTCHIP, Inc. ("Confidential Information"). You shall not disclose such
|
|
* Confidential Information and shall use it only in accordance with
|
|
* the terms of the license agreement you entered into with NEXTCHIP.
|
|
********************************************************************************
|
|
|
|
********************************************************************************
|
|
* @file : nc_opengl_bitmap_font.c
|
|
*
|
|
* @brief : nc_opengl_bitmap_font source
|
|
*
|
|
* @author : Software Development Team. NextChip Inc.
|
|
*
|
|
* @date : 2024.08.09.
|
|
*
|
|
* @version : 1.0.0
|
|
********************************************************************************
|
|
* @note
|
|
*
|
|
********************************************************************************
|
|
*/
|
|
|
|
#include "nc_opengl_bitmap_font.h"
|
|
#include "nc_opengl_init.h"
|
|
#include "nc_opengl_shader.h"
|
|
|
|
void nc_initText2D(window *window){
|
|
|
|
// Initialize texture
|
|
window->font.FontTexture = nc_loadTexture("misc/texture/holstein.tga");
|
|
|
|
// Initialize VBO
|
|
glGenBuffers(1, &window->font.vertexBufferID);
|
|
glGenBuffers(1, &window->font.uvBufferID);
|
|
|
|
// Initialize Shader
|
|
window->font.program = nc_createProgram(TextVertexShaderSource, TextFragmentShaderSource);
|
|
|
|
// Initialize uniforms' IDs
|
|
window->font.FontTextureID = glGetUniformLocation(window->font.program, "myTextureSampler" );
|
|
|
|
// Get the location of the uniform variable in the shader
|
|
window->font.colorModifier = glGetUniformLocation(window->font.program, "colorModifier");
|
|
}
|
|
|
|
void nc_printText2D(const char *text, int x, int y, int size, float textcolor[4],
|
|
window *window) {
|
|
unsigned int length = (unsigned int)strlen(text);
|
|
unsigned int numVertices = 6 * length;
|
|
|
|
float size_x = (float)(size*0.6);
|
|
|
|
float* vertices = (float*)malloc(numVertices * 2 * sizeof(float));
|
|
float* UVs = (float*)malloc(numVertices * 2 * sizeof(float));
|
|
|
|
for (unsigned int i = 0; i < length; i++) {
|
|
float xpos = (float)x + (float)i * size_x;
|
|
float ypos = (float)y;
|
|
|
|
float uv_x = (float)(text[i] % 16) / 16.0f;
|
|
float uv_y = (float)(text[i] / 16) / 16.0f;
|
|
|
|
float uv_x1 = uv_x;
|
|
float uv_x2 = uv_x + 1.0f / 16.0f;
|
|
float uv_y1 = 1.0f - uv_y;
|
|
float uv_y2 = 1.0f - (uv_y + 1.0f / 16.0f);
|
|
|
|
// Vertices
|
|
float *vertexPtr = &vertices[i * 12];
|
|
vertexPtr[0] = xpos; vertexPtr[1] = ypos + (float)size;
|
|
vertexPtr[2] = xpos; vertexPtr[3] = ypos;
|
|
vertexPtr[4] = xpos + size_x; vertexPtr[5] = ypos;
|
|
vertexPtr[6] = xpos + size_x; vertexPtr[7] = ypos;
|
|
vertexPtr[8] = xpos + size_x; vertexPtr[9] = ypos + (float)size;
|
|
vertexPtr[10] = xpos; vertexPtr[11] = ypos + (float)size;
|
|
|
|
// UVs
|
|
float *uvPtr = &UVs[i * 12];
|
|
uvPtr[0] = uv_x1; uvPtr[1] = uv_y1;
|
|
uvPtr[2] = uv_x1; uvPtr[3] = uv_y2;
|
|
uvPtr[4] = uv_x2; uvPtr[5] = uv_y2;
|
|
uvPtr[6] = uv_x2; uvPtr[7] = uv_y2;
|
|
uvPtr[8] = uv_x2; uvPtr[9] = uv_y1;
|
|
uvPtr[10] = uv_x1; uvPtr[11] = uv_y1;
|
|
}
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, window->font.vertexBufferID);
|
|
glBufferData(GL_ARRAY_BUFFER, length * 6 * 2 * sizeof(float), &vertices[0], GL_STATIC_DRAW);
|
|
glBindBuffer(GL_ARRAY_BUFFER, window->font.uvBufferID);
|
|
glBufferData(GL_ARRAY_BUFFER, length * 6 * 2 * sizeof(float), &UVs[0], GL_STATIC_DRAW);
|
|
|
|
// Bind shader
|
|
glUseProgram(window->font.program);
|
|
|
|
// Set the color modifier value (r, g, b, a)
|
|
glUniform4fv(window->font.colorModifier, 1, textcolor);
|
|
|
|
// Bind texture
|
|
glActiveTexture(GL_TEXTURE0);
|
|
glBindTexture(GL_TEXTURE_2D, window->font.FontTexture);
|
|
// Set our "myTextureSampler" sampler to user Texture Unit 0
|
|
glUniform1i(window->font.FontTextureID, 0);
|
|
|
|
// 1rst attribute buffer : vertices
|
|
glEnableVertexAttribArray(0);
|
|
glBindBuffer(GL_ARRAY_BUFFER, window->font.vertexBufferID);
|
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
|
|
|
|
// 2nd attribute buffer : UVs
|
|
glEnableVertexAttribArray(1);
|
|
glBindBuffer(GL_ARRAY_BUFFER, window->font.uvBufferID);
|
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0 );
|
|
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
// Draw call
|
|
glDrawArrays(GL_TRIANGLES, 0, 6 * length);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
glDisableVertexAttribArray(0);
|
|
glDisableVertexAttribArray(1);
|
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
|
|
free(vertices);
|
|
free(UVs);
|
|
}
|