Cleanup: rework resources creation.
This commit is contained in:
		@ -122,88 +122,37 @@ rk_shader_t rk_load_shader(
 | 
			
		||||
    return shader;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_select_shader(
 | 
			
		||||
    rk_shader_t _shader) {
 | 
			
		||||
    rk_shader * const shader = reinterpret_cast<rk_shader *>(_shader);
 | 
			
		||||
    if (shader) {
 | 
			
		||||
        rk_current_shader = shader;
 | 
			
		||||
        glUseProgram(shader->program);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rk_input_t rk_resolve_input(
 | 
			
		||||
    rk_shader_t _shader,
 | 
			
		||||
    char const * name) {
 | 
			
		||||
    if (!rk_current_shader || !name) {
 | 
			
		||||
    rk_shader const * const shader = reinterpret_cast<rk_shader const *>(_shader);
 | 
			
		||||
    if (!shader || !name) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    GLint const uniform = glGetUniformLocation(rk_current_shader->program, name);
 | 
			
		||||
    GLint const uniform = glGetUniformLocation(shader->program, name);
 | 
			
		||||
    return reinterpret_cast<rk_input_t>(uniform + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_float(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    float value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniform1f(input, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_vec3(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_vec3 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniform3fv(input, 1, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_mat3(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_mat3 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniformMatrix3fv(input, 1, GL_FALSE, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_mat4(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_mat4 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniformMatrix4fv(input, 1, GL_FALSE, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rk_param_t rk_resolve_param(
 | 
			
		||||
    rk_shader_t _shader,
 | 
			
		||||
    char const * name) {
 | 
			
		||||
    if (!rk_current_shader || !name) {
 | 
			
		||||
    rk_shader const * const shader = reinterpret_cast<rk_shader const *>(_shader);
 | 
			
		||||
    if (!shader || !name) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    GLint const location = glGetAttribLocation(rk_current_shader->program, name);
 | 
			
		||||
    GLint const location = glGetAttribLocation(shader->program, name);
 | 
			
		||||
    return reinterpret_cast<rk_param_t>(location + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_param_vec3(
 | 
			
		||||
    rk_param_t _param,
 | 
			
		||||
    rk_vec3 const & value) {
 | 
			
		||||
    GLint const param = reinterpret_cast<intptr_t>(_param) - 1;
 | 
			
		||||
    if (rk_current_shader && param > -1) {
 | 
			
		||||
        glVertexAttrib3fv(param, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rk_texture_t rk_create_texture(
 | 
			
		||||
    rk_uint slot,
 | 
			
		||||
    char const * input,
 | 
			
		||||
    rk_texture_format format,
 | 
			
		||||
    rk_uint width,
 | 
			
		||||
    rk_uint height,
 | 
			
		||||
    rk_uint nlevels,
 | 
			
		||||
    rk_texture_flags flags,
 | 
			
		||||
    void const * pixels) {
 | 
			
		||||
    if (!input || width == 0 || height == 0 || !pixels || !rk_current_shader) {
 | 
			
		||||
    if (!width || !height || !pixels) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    GLint internal_format;
 | 
			
		||||
@ -279,10 +228,6 @@ rk_texture_t rk_create_texture(
 | 
			
		||||
    }
 | 
			
		||||
    texture->slot = slot;
 | 
			
		||||
    texture->nlevels = nlevels;
 | 
			
		||||
    texture->sampler = glGetUniformLocation(rk_current_shader->program, input);
 | 
			
		||||
    if (texture->sampler == -1) {
 | 
			
		||||
        printf("[RK_ENGINE] glGetUniformLocation(%s) failed\n", input);
 | 
			
		||||
    }
 | 
			
		||||
    glBindTexture(target, 0);
 | 
			
		||||
    return texture;
 | 
			
		||||
}
 | 
			
		||||
@ -290,7 +235,7 @@ rk_texture_t rk_create_texture(
 | 
			
		||||
rk_triangles_t rk_create_triangles(
 | 
			
		||||
    rk_uint nvertices,
 | 
			
		||||
    rk_vec3 const * vertices) {
 | 
			
		||||
    if (nvertices == 0 || !vertices || !rk_current_shader) {
 | 
			
		||||
    if (!nvertices || !vertices) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    rk_triangles * const triangles = new rk_triangles;
 | 
			
		||||
@ -313,7 +258,7 @@ rk_vertices_t rk_create_vertices(
 | 
			
		||||
    void const * _vertices,
 | 
			
		||||
    rk_uint nindices,
 | 
			
		||||
    rk_ushort const * indices) {
 | 
			
		||||
    if (!format || !nvertices || !_vertices || !nindices || !indices || !rk_current_shader) {
 | 
			
		||||
    if (!format || !nvertices || !_vertices || !nindices || !indices) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    rk_uint vertex_size = 0;
 | 
			
		||||
@ -407,10 +352,13 @@ static void rk_pack_vec3_int10(
 | 
			
		||||
    #undef _convert
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//TODO: multiple batches per vertices
 | 
			
		||||
rk_batch_t rk_create_batch(
 | 
			
		||||
    rk_vertices_t _vertices,
 | 
			
		||||
    rk_uint max_size,
 | 
			
		||||
    rk_param_format const * params_format) {
 | 
			
		||||
    if (!max_size || !params_format || max_size > RK_BATCH_MAX_SIZE || !rk_current_shader || !rk_current_vertices) {
 | 
			
		||||
    rk_vertices const * const vertices = reinterpret_cast<rk_vertices const *>(_vertices);
 | 
			
		||||
    if (!vertices || !max_size || !params_format || max_size > RK_BATCH_MAX_SIZE) {
 | 
			
		||||
        rk_printf("rk_create_batch(): invalid parameters.");
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
@ -448,9 +396,10 @@ rk_batch_t rk_create_batch(
 | 
			
		||||
        batch->packers = new rk_packer[nparams];
 | 
			
		||||
        batch->params = new rk_ubyte[max_size * packed_size];
 | 
			
		||||
        glGenBuffers(1, &batch->params_buffer);
 | 
			
		||||
        rk_uint layout = rk_current_vertices->layout;
 | 
			
		||||
        rk_uint layout = vertices->layout;
 | 
			
		||||
        rk_packer * packer = batch->packers;
 | 
			
		||||
        rk_uint offset = 0;
 | 
			
		||||
        glBindVertexArray(vertices->array);
 | 
			
		||||
        for (rk_param_format const * f = params_format; *f; ++f, ++layout, ++packer) {
 | 
			
		||||
            GLboolean const normalize = (*f & RK_PARAM_FORMAT_NORMALIZE) != 0;
 | 
			
		||||
            glEnableVertexAttribArray(layout);
 | 
			
		||||
@ -483,6 +432,7 @@ rk_batch_t rk_create_batch(
 | 
			
		||||
        }
 | 
			
		||||
        glVertexBindingDivisor(RK_PARAMS_BINDING, 1);
 | 
			
		||||
        glBindVertexBuffer(RK_PARAMS_BINDING, batch->params_buffer, 0, batch->packed_size);
 | 
			
		||||
        glBindVertexArray(0);
 | 
			
		||||
    }
 | 
			
		||||
    if (rk_MultiDrawElementsIndirect) {
 | 
			
		||||
        glGenBuffers(1, &batch->commands_buffer);
 | 
			
		||||
@ -494,19 +444,73 @@ void rk_begin_frame() {
 | 
			
		||||
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_select_shader(
 | 
			
		||||
    rk_shader_t _shader) {
 | 
			
		||||
    rk_shader * const shader = reinterpret_cast<rk_shader *>(_shader);
 | 
			
		||||
    if (shader) {
 | 
			
		||||
        rk_current_shader = shader;
 | 
			
		||||
        glUseProgram(shader->program);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_float(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    float value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniform1f(input, value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_vec3(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_vec3 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniform3fv(input, 1, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_mat3(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_mat3 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniformMatrix3fv(input, 1, GL_FALSE, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_input_mat4(
 | 
			
		||||
    rk_input_t _input,
 | 
			
		||||
    rk_mat4 const & value) {
 | 
			
		||||
    GLint const input = reinterpret_cast<intptr_t>(_input) - 1;
 | 
			
		||||
    if (rk_current_shader && input > -1) {
 | 
			
		||||
        glUniformMatrix4fv(input, 1, GL_FALSE, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_set_param_vec3(
 | 
			
		||||
    rk_param_t _param,
 | 
			
		||||
    rk_vec3 const & value) {
 | 
			
		||||
    GLint const param = reinterpret_cast<intptr_t>(_param) - 1;
 | 
			
		||||
    if (rk_current_shader && param > -1) {
 | 
			
		||||
        glVertexAttrib3fv(param, glm::value_ptr(value));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rk_select_texture(
 | 
			
		||||
    rk_texture_t _texture) {
 | 
			
		||||
    rk_texture_t _texture,
 | 
			
		||||
    rk_input_t _sampler) {
 | 
			
		||||
    rk_texture const * const texture = reinterpret_cast<rk_texture const *>(_texture);
 | 
			
		||||
    if (texture) {
 | 
			
		||||
    GLint const sampler = reinterpret_cast<intptr_t>(_sampler) - 1;
 | 
			
		||||
    if (texture && sampler > -1 && rk_current_shader) {
 | 
			
		||||
        glActiveTexture(GL_TEXTURE0 + texture->slot);
 | 
			
		||||
        if (texture->nlevels) {
 | 
			
		||||
            glBindTexture(GL_TEXTURE_2D_ARRAY, texture->texture);
 | 
			
		||||
        } else {
 | 
			
		||||
            glBindTexture(GL_TEXTURE_2D, texture->texture);
 | 
			
		||||
        }
 | 
			
		||||
        if (texture->sampler > -1) {
 | 
			
		||||
            glUniform1i(texture->sampler, texture->slot);
 | 
			
		||||
        }
 | 
			
		||||
        glUniform1i(sampler, texture->slot);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -523,7 +527,7 @@ RK_EXPORT void rk_draw_triangles(
 | 
			
		||||
void rk_select_vertices(
 | 
			
		||||
    rk_vertices_t _vertices) {
 | 
			
		||||
    rk_vertices * const vertices = reinterpret_cast<rk_vertices *>(_vertices);
 | 
			
		||||
    if (vertices && rk_current_shader) {
 | 
			
		||||
    if (vertices) {
 | 
			
		||||
        glBindVertexArray(vertices->array);
 | 
			
		||||
        rk_current_vertices = vertices;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,6 @@ struct rk_shader {
 | 
			
		||||
struct rk_texture {
 | 
			
		||||
    rk_uint slot;
 | 
			
		||||
    rk_uint nlevels;
 | 
			
		||||
    GLint sampler;
 | 
			
		||||
    GLuint texture;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user