rk_engine/cpp/render.hpp
2023-01-03 14:05:25 +01:00

200 lines
5.1 KiB
C++

// Copyright (C) 2022 RozK
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef _RK_ENGINE_RENDER_H
#define _RK_ENGINE_RENDER_H
#include "types.hpp"
#include "math.hpp"
typedef rk_handle_t rk_shader_t;
typedef rk_handle_t rk_input_t;
typedef rk_handle_t rk_param_t;
typedef rk_handle_t rk_texture_t;
typedef rk_handle_t rk_triangles_t;
typedef rk_handle_t rk_vertices_t;
typedef rk_handle_t rk_batch_t;
enum rk_texture_format : rk_uint {
RK_TEXTURE_FORMAT_SRGB8_A8 = 0,
RK_TEXTURE_FORMAT_RGBA8 = 1,
RK_TEXTURE_FORMAT_RGB10_A2 = 2,
RK_TEXTURE_FORMAT_FLOAT_32 = 3
};
enum rk_texture_flags : rk_uint {
RK_TEXTURE_FLAG_3D = RK_FLAG(0),
RK_TEXTURE_FLAG_MIPMAPS = RK_FLAG(1),
RK_TEXTURE_FLAG_MIN_NEAREST = 0,
RK_TEXTURE_FLAG_MIN_LINEAR = RK_FLAG(2),
RK_TEXTURE_FLAG_MAG_NEAREST = 0,
RK_TEXTURE_FLAG_MAG_LINEAR = RK_FLAG(3),
};
enum rk_vertex_format : rk_ubyte {
RK_VERTEX_FORMAT_VEC3_FLOAT = 1,
RK_VERTEX_FORMAT_VEC3_INT10 = 2,
RK_VERTEX_FORMAT_VEC3_UINT10 = 3
};
enum : rk_ubyte { RK_VERTEX_FORMAT_NORMALIZE = RK_FLAG(7) };
enum : rk_ubyte { RK_VERTEX_FORMAT_MASK = RK_VERTEX_FORMAT_NORMALIZE - 1 };
enum rk_param_format : rk_ubyte {
RK_PARAM_FORMAT_VEC3_FLOAT = 1,
RK_PARAM_FORMAT_VEC3_SHORT = 2,
RK_PARAM_FORMAT_VEC3_INT10 = 3,
RK_PARAM_FORMAT_MAT3_FLOAT = 4,
RK_PARAM_FORMAT_MAT3_INT10 = 5
};
enum : rk_ubyte { RK_PARAM_FORMAT_NORMALIZE = RK_FLAG(7) };
enum : rk_ubyte { RK_PARAM_FORMAT_MASK = RK_PARAM_FORMAT_NORMALIZE - 1 };
enum rk_instance_flags : rk_ubyte {
RK_INSTANCE_FLAG_SPAWNED = RK_FLAG(0),
RK_INSTANCE_FLAG_VISIBLE = RK_FLAG(1)
};
enum : rk_ubyte { RK_INSTANCE_FLAGS_SPAWNED_VISIBLE = RK_INSTANCE_FLAG_SPAWNED | RK_INSTANCE_FLAG_VISIBLE };
enum : rk_uint { RK_BATCH_MAX_SIZE = 65536 };
union rk_mesh {
rk_uint packed;
struct {
rk_ushort base_index;
rk_ushort ntriangles;
};
};
RK_EXPORT void rk_render_initialize(
rk_bool debug);
RK_EXPORT void rk_render_terminate();
RK_EXPORT rk_shader_t rk_create_shader(
rk_uint const vert_nlines,
rk_char const * const * vert_lines,
rk_uint const frag_nlines,
rk_char const * const * frag_lines);
RK_EXPORT rk_input_t rk_resolve_input(
rk_shader_t shader,
rk_char const * name);
RK_EXPORT rk_param_t rk_resolve_param(
rk_shader_t shader,
rk_char const * name);
RK_EXPORT rk_texture_t rk_create_texture(
rk_texture_format format,
rk_uint width,
rk_uint height,
rk_uint nlevels,
rk_texture_flags flags,
rk_ubyte const * pixels);
RK_EXPORT rk_triangles_t rk_create_triangles(
rk_uint nvertices,
rk_vec3 const * vertices);
RK_EXPORT rk_vertices_t rk_create_vertices(
rk_vertex_format const * format,
rk_uint nvertices,
rk_ubyte const * vertices,
rk_uint nindices,
rk_ushort const * indices,
rk_uint nmeshes,
rk_mesh const * meshes);
RK_EXPORT rk_batch_t rk_create_batch(
rk_vertices_t vertices,
rk_uint max_size,
rk_param_format const * params_format);
RK_EXPORT void rk_fill_batch(
rk_batch_t batch,
rk_uint count,
rk_instance_flags const * flags,
rk_ushort const * meshes,
rk_ubyte const * const * params);
RK_EXPORT void rk_clear_buffer(
rk_bool pixels,
rk_bool depth,
rk_bool stencil);
RK_EXPORT void rk_select_shader(
rk_shader_t _shader);
RK_EXPORT void rk_set_input_float(
rk_input_t input,
float value);
RK_EXPORT void rk_set_input_vec3(
rk_input_t input,
rk_vec3 const & value);
RK_EXPORT void rk_set_input_mat3(
rk_input_t input,
rk_mat3 const & value);
RK_EXPORT void rk_set_input_mat4(
rk_input_t input,
rk_mat4 const & value);
RK_EXPORT void rk_set_param_vec3(
rk_param_t param,
rk_vec3 const & value);
RK_EXPORT void rk_set_param_mat3(
rk_param_t param,
rk_mat3 const & value);
RK_EXPORT void rk_select_texture(
rk_uint slot,
rk_texture_t texture);
RK_EXPORT void rk_draw_triangles(
rk_triangles_t triangles);
RK_EXPORT void rk_draw_batch(
rk_batch_t batch);
RK_EXPORT void rk_unselect_texture(
rk_uint slot,
rk_texture_t texture);
RK_EXPORT void rk_unselect_shader(
rk_shader_t shader);
RK_EXPORT void rk_destroy_batch(
rk_batch_t batch);
RK_EXPORT void rk_destroy_triangles(
rk_triangles_t triangles);
RK_EXPORT void rk_destroy_vertices(
rk_vertices_t vertices);
RK_EXPORT void rk_destroy_texture(
rk_texture_t texture);
RK_EXPORT void rk_destroy_shader(
rk_shader_t shader);
#endif // _RK_ENGINE_RENDER_H