First commit

This commit is contained in:
2026-09-16 11:46:41 +03:00
commit 68f4f9a532
29 changed files with 1301 additions and 0 deletions
View File
+1
View File
@@ -0,0 +1 @@
c505e04113e221188440051de27fad12c0670205
@@ -0,0 +1,37 @@
#ifndef SCUFENG_CAMERA_H_
#define SCUFENG_CAMERA_H_
#include "cglm/types.h"
#include "scufeng/engine.h"
typedef struct {
vec3 pos;
float pitch_rad;
float yaw_rad;
float fov_rad;
float near_clip;
float far_clip;
vec3 front;
vec3 right;
mat4 view;
mat4 projection;
} SECamera;
SECamera SECamera_new(
vec3 pos,
const float fov_rad,
const float near_clip,
const float far_clip
);
void SECamera_set_perspective(SECamera *const camera);
void SECamera_pos_set(SECamera *const camera, vec3 pos);
void SECamera_move_to_direction(SECamera *const camera, SEDirection dir, const float mag);
void SECamera_look_dir(SECamera *const camera, vec3 dir);
void SECamera_look_at(SECamera *const camera, vec3 target);
void SECamera_pitch_add(SECamera *const camera, const float pitch_rad);
void SECamera_yaw_add(SECamera *const camera, const float yaw_rad);
void SECamera_view_update(SECamera *const camera);
#endif // SCUFENG_CAMERA_H_
@@ -0,0 +1,12 @@
#ifndef SCUFENG_SCENE_H_
#define SCUFENG_SCENE_H_
#include "scufeng/Shape.h"
#include "engine.h"
void se_render_meshes_2d(SEMesh *const *const meshes, const size_t meshes_n);
SEResult se_render_line_segment(const vec2 p1, const vec2 p2, const vec4 color);
SEResult se_render_line_segment_norm_coord(const vec2 p1, const vec2 p2, const vec4 color);
void se_text_render(const char* text, int x, int y, float scale, const vec3 color);
#endif // SCUFENG_SCENE_H_
@@ -0,0 +1,90 @@
#ifndef SCUFENG_SHAPE_H_
#define SCUFENG_SHAPE_H_
#include <stddef.h>
#include <stdbool.h>
#include "cglm/types.h"
#include "scufeng/engine.h"
typedef enum {
SE_TRIANGLES,
SE_TRIANGLE_STRIP,
SE_TRIANGLE_FAN,
SE_LINES,
SE_LINE_STRIP
} SEDrawMode;
typedef struct {
vec3 pos;
vec3 scale;
vec3 rotation;
} SETransform;
typedef struct {
float pos[3];
float tex_coords[2];
} SEVertex;
typedef enum {
SE_MESH_COLOR,
SE_MESH_TEXTURE
} SEMeshType;
typedef struct {
unsigned int id;
float w;
float h;
} SEMeshTexture;
typedef struct {
unsigned int vao;
unsigned int vbo;
size_t verts_n;
int draw_mode;
SETransform transform;
SEMeshType type;
union {
SEMeshTexture texture;
vec4 color;
};
} SEMesh;
SEResult SEShape_alloc(
SETransform *const shape,
const SEVertex *const vertices,
const size_t vertices_n,
const vec4 color,
const SEDrawMode draw_mode
);
void SEMesh_free(SEMesh *const mesh);
void SEMesh_set_draw_mode(SEMesh *mesh, const SEDrawMode mode);
void SEMesh_render(const SEMesh *const mesh);
void SEMesh_bbox_get_2d(
const SEMesh *const mesh,
float *left,
float *right,
float *top,
float *bottom
);
bool SEMesh_rect_is_pos_inside(const SEMesh *const mesh, const float x, const float y);
void SEShape_rotation_set(SETransform *shape, vec3 rotation);
void SEShape_rotate_2d_center(SETransform *const shape, const float w, const float h, const float angle_rad);
void SEShape_scale_set(SETransform *shape, vec3 scale);
void SEShape_scale(SETransform *const shape, vec3 scale);
void SEShape_pos_set(SETransform *const shape, vec3 pos);
void SEShape_translate_2d_center(SETransform *const shape, const float w, const float h, const vec2 pos);
void SEShape_transform_reset(SETransform *shape);
SEMesh SEMesh_rect_color_alloc(vec4 color);
SEMesh SEMesh_string_alloc(
const char *text,
const float scale,
const vec3 color
);
// void SEShape_transform_apply(SEShape *const shape);
#endif // SCUFENG_SHAPE_H_
@@ -0,0 +1,74 @@
#ifndef SCUFENG_H_
#define SCUFENG_H_
#include <stdbool.h>
#include "keys.h" // IWYU pragma: export
#define SERESULT_X(X) \
X(SE_SUCCESS) \
X(SE_OUT_OF_MEMORY) \
X(SE_FC_FAILURE) \
X(SE_NOT_FOUND) \
X(SE_FT_FAILURE)
#define X(val) val,
typedef enum {
SERESULT_X(X)
} SEResult;
#undef X
typedef enum {
SE_FILL,
SE_LINE,
SE_POINT
} SEPolygonMode;
typedef enum {
SE_NONE,
SE_FORWARD,
SE_BACKWARD,
SE_LEFT,
SE_RIGHT,
SE_UP,
SE_DOWN
} SEDirection;
typedef void (*SEKeyCb)(SEKey key, SEKeyAction action, SEKeyMod mods);
void se_init(const bool debug);
void se_deinit(void);
void se_window_create(
const int w,
const int h,
const char* title,
const int fullscreen_monitor_i
);
void se_window_close();
void se_clear_color(
const float r,
const float g,
const float b,
const float a
);
void se_clear(void);
void se_swap_buffers(void);
bool se_window_should_close(void);
void se_handle_events(void);
double se_get_time(void);
double se_delta_time(const double current_time);
void se_set_polygon_mode(const SEPolygonMode mode);
void se_set_key_callback(SEKeyCb cb);
SEKeyAction se_get_key(const SEKey key);
SEKeyAction se_get_mouse_button(const SEMouseButton btn);
void se_get_mouse_pos(double *x, double *y);
void se_swap_interval(const int interval);
void se_fps_lock_set_fps(const unsigned int fps);
void se_fps_lock_frame_start_s(const double frame_start_s);
void se_fps_lock_wait(void);
const char* SEResult_to_str(const SEResult res);
#endif // SCUFENG_H_
+164
View File
@@ -0,0 +1,164 @@
#ifndef SCUFENG_KEYS_H_
#define SCUFENG_KEYS_H_
#include "GLFW/glfw3.h"
typedef enum {
SE_KEY_UNKNOWN = GLFW_KEY_UNKNOWN,
/* Printable keys */
SE_KEY_SPACE = GLFW_KEY_SPACE,
SE_KEY_APOSTROPHE = GLFW_KEY_APOSTROPHE,
SE_KEY_COMMA = GLFW_KEY_COMMA,
SE_KEY_MINUS = GLFW_KEY_MINUS,
SE_KEY_PERIOD = GLFW_KEY_PERIOD,
SE_KEY_SLASH = GLFW_KEY_SLASH,
SE_KEY_0 = GLFW_KEY_0,
SE_KEY_1 = GLFW_KEY_1,
SE_KEY_2 = GLFW_KEY_2,
SE_KEY_3 = GLFW_KEY_3,
SE_KEY_4 = GLFW_KEY_4,
SE_KEY_5 = GLFW_KEY_5,
SE_KEY_6 = GLFW_KEY_6,
SE_KEY_7 = GLFW_KEY_7,
SE_KEY_8 = GLFW_KEY_8,
SE_KEY_9 = GLFW_KEY_9,
SE_KEY_SEMICOLON = GLFW_KEY_SEMICOLON,
SE_KEY_EQUAL = GLFW_KEY_EQUAL,
SE_KEY_A = GLFW_KEY_A,
SE_KEY_B = GLFW_KEY_B,
SE_KEY_C = GLFW_KEY_C,
SE_KEY_D = GLFW_KEY_D,
SE_KEY_E = GLFW_KEY_E,
SE_KEY_F = GLFW_KEY_F,
SE_KEY_G = GLFW_KEY_G,
SE_KEY_H = GLFW_KEY_H,
SE_KEY_I = GLFW_KEY_I,
SE_KEY_J = GLFW_KEY_J,
SE_KEY_K = GLFW_KEY_K,
SE_KEY_L = GLFW_KEY_L,
SE_KEY_M = GLFW_KEY_M,
SE_KEY_N = GLFW_KEY_N,
SE_KEY_O = GLFW_KEY_O,
SE_KEY_P = GLFW_KEY_P,
SE_KEY_Q = GLFW_KEY_Q,
SE_KEY_R = GLFW_KEY_R,
SE_KEY_S = GLFW_KEY_S,
SE_KEY_T = GLFW_KEY_T,
SE_KEY_U = GLFW_KEY_U,
SE_KEY_V = GLFW_KEY_V,
SE_KEY_W = GLFW_KEY_W,
SE_KEY_X = GLFW_KEY_X,
SE_KEY_Y = GLFW_KEY_Y,
SE_KEY_Z = GLFW_KEY_Z,
SE_KEY_LEFT_BRACKET = GLFW_KEY_LEFT_BRACKET,
SE_KEY_BACKSLASH = GLFW_KEY_BACKSLASH,
SE_KEY_RIGHT_BRACKET = GLFW_KEY_RIGHT_BRACKET,
SE_KEY_GRAVE_ACCENT = GLFW_KEY_GRAVE_ACCENT,
SE_KEY_WORLD_1 = GLFW_KEY_WORLD_1,
SE_KEY_WORLD_2 = GLFW_KEY_WORLD_2,
/* Function keys */
SE_KEY_ESCAPE = GLFW_KEY_ESCAPE,
SE_KEY_ENTER = GLFW_KEY_ENTER,
SE_KEY_TAB = GLFW_KEY_TAB,
SE_KEY_BACKSPACE = GLFW_KEY_BACKSPACE,
SE_KEY_INSERT = GLFW_KEY_INSERT,
SE_KEY_DELETE = GLFW_KEY_DELETE,
SE_KEY_RIGHT = GLFW_KEY_RIGHT,
SE_KEY_LEFT = GLFW_KEY_LEFT,
SE_KEY_DOWN = GLFW_KEY_DOWN,
SE_KEY_UP = GLFW_KEY_UP,
SE_KEY_PAGE_UP = GLFW_KEY_PAGE_UP,
SE_KEY_PAGE_DOWN = GLFW_KEY_PAGE_DOWN,
SE_KEY_HOME = GLFW_KEY_HOME,
SE_KEY_END = GLFW_KEY_END,
SE_KEY_CAPS_LOCK = GLFW_KEY_CAPS_LOCK,
SE_KEY_SCROLL_LOCK = GLFW_KEY_SCROLL_LOCK,
SE_KEY_NUM_LOCK = GLFW_KEY_NUM_LOCK,
SE_KEY_PRINT_SCREEN = GLFW_KEY_PRINT_SCREEN,
SE_KEY_PAUSE = GLFW_KEY_PAUSE,
SE_KEY_F1 = GLFW_KEY_F1,
SE_KEY_F2 = GLFW_KEY_F2,
SE_KEY_F3 = GLFW_KEY_F3,
SE_KEY_F4 = GLFW_KEY_F4,
SE_KEY_F5 = GLFW_KEY_F5,
SE_KEY_F6 = GLFW_KEY_F6,
SE_KEY_F7 = GLFW_KEY_F7,
SE_KEY_F8 = GLFW_KEY_F8,
SE_KEY_F9 = GLFW_KEY_F9,
SE_KEY_F10 = GLFW_KEY_F10,
SE_KEY_F11 = GLFW_KEY_F11,
SE_KEY_F12 = GLFW_KEY_F12,
SE_KEY_F13 = GLFW_KEY_F13,
SE_KEY_F14 = GLFW_KEY_F14,
SE_KEY_F15 = GLFW_KEY_F15,
SE_KEY_F16 = GLFW_KEY_F16,
SE_KEY_F17 = GLFW_KEY_F17,
SE_KEY_F18 = GLFW_KEY_F18,
SE_KEY_F19 = GLFW_KEY_F19,
SE_KEY_F20 = GLFW_KEY_F20,
SE_KEY_F21 = GLFW_KEY_F21,
SE_KEY_F22 = GLFW_KEY_F22,
SE_KEY_F23 = GLFW_KEY_F23,
SE_KEY_F24 = GLFW_KEY_F24,
SE_KEY_F25 = GLFW_KEY_F25,
SE_KEY_KP_0 = GLFW_KEY_KP_0,
SE_KEY_KP_1 = GLFW_KEY_KP_1,
SE_KEY_KP_2 = GLFW_KEY_KP_2,
SE_KEY_KP_3 = GLFW_KEY_KP_3,
SE_KEY_KP_4 = GLFW_KEY_KP_4,
SE_KEY_KP_5 = GLFW_KEY_KP_5,
SE_KEY_KP_6 = GLFW_KEY_KP_6,
SE_KEY_KP_7 = GLFW_KEY_KP_7,
SE_KEY_KP_8 = GLFW_KEY_KP_8,
SE_KEY_KP_9 = GLFW_KEY_KP_9,
SE_KEY_KP_DECIMAL = GLFW_KEY_KP_DECIMAL,
SE_KEY_KP_DIVIDE = GLFW_KEY_KP_DIVIDE,
SE_KEY_KP_MULTIPLY = GLFW_KEY_KP_MULTIPLY,
SE_KEY_KP_SUBTRACT = GLFW_KEY_KP_SUBTRACT,
SE_KEY_KP_ADD = GLFW_KEY_KP_ADD,
SE_KEY_KP_ENTER = GLFW_KEY_KP_ENTER,
SE_KEY_KP_EQUAL = GLFW_KEY_KP_EQUAL,
SE_KEY_LEFT_SHIFT = GLFW_KEY_LEFT_SHIFT,
SE_KEY_LEFT_CONTROL = GLFW_KEY_LEFT_CONTROL,
SE_KEY_LEFT_ALT = GLFW_KEY_LEFT_ALT,
SE_KEY_LEFT_SUPER = GLFW_KEY_LEFT_SUPER,
SE_KEY_RIGHT_SHIFT = GLFW_KEY_RIGHT_SHIFT,
SE_KEY_RIGHT_CONTROL = GLFW_KEY_RIGHT_CONTROL,
SE_KEY_RIGHT_ALT = GLFW_KEY_RIGHT_ALT,
SE_KEY_RIGHT_SUPER = GLFW_KEY_RIGHT_SUPER,
SE_KEY_MENU = GLFW_KEY_MENU,
} SEKey;
typedef enum {
SE_KEY_ACTION_RELEASE = GLFW_RELEASE,
SE_KEY_ACTION_PRESS = GLFW_PRESS,
SE_KEY_ACTION_REPEAT = GLFW_REPEAT,
} SEKeyAction;
typedef enum {
SE_KEY_MOD_SHIFT = GLFW_MOD_SHIFT,
SE_KEY_MOD_CONTROL = GLFW_MOD_CONTROL,
SE_KEY_MOD_ALT = GLFW_MOD_ALT,
SE_KEY_MOD_SUPER = GLFW_MOD_SUPER,
SE_KEY_MOD_CAPS_LOCK = GLFW_MOD_CAPS_LOCK,
SE_KEY_MOD_NUM_LOCK = GLFW_MOD_NUM_LOCK,
} SEKeyMod;
typedef enum {
SE_MOUSE_BUTTON_1 = 0,
SE_MOUSE_BUTTON_2 = 1,
SE_MOUSE_BUTTON_3 = 2,
SE_MOUSE_BUTTON_4 = 3,
SE_MOUSE_BUTTON_5 = 4,
SE_MOUSE_BUTTON_6 = 5,
SE_MOUSE_BUTTON_7 = 6,
SE_MOUSE_BUTTON_8 = 7,
SE_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8,
SE_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1,
SE_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2,
SE_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3,
} SEMouseButton;
#endif // SCUFENG_KEYS_H_
+23
View File
@@ -0,0 +1,23 @@
#ifndef LOG_H_
#define LOG_H_
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#define LOG(str) log_with_tag(stdout, __FILE__, __LINE__, "LOG", (str))
#define LOGF(fmt, ...) logf_with_tag(stdout, __FILE__, __LINE__, "LOG", (fmt), __VA_ARGS__)
#define LOG_ERROR(str) log_with_tag(stderr, __FILE__, __LINE__, "ERROR", (str))
#define LOG_ERRORF(fmt, ...) logf_with_tag(stderr, __FILE__, __LINE__, "ERROR", (fmt), __VA_ARGS__)
#define LOG_FATAL(str) LOG_ERROR(str); exit(-1)
#define LOG_FATALF(fmt, ...) LOG_ERRORF(fmt, __VA_ARGS__); exit(-1)
#define LOG_FATAL_TODO(str) log_with_tag(stderr, __FILE__, __LINE__, "FATAL TODO", (str)); exit(-1)
#define LOG_FATAL_TODOF(fmt, ...) logf_with_tag(stderr, __FILE__, __LINE__, "FATAL TODO", (fmt), __VA_ARGS__); exit(-1)
void log_with_tag(FILE* out_file, char* file_name, size_t line, const char* tag, char* str);
void logf_with_tag(FILE* out_file, char* file_name, size_t line, const char* tag, char* fmt, ...);
#endif // LOG_H_
@@ -0,0 +1,18 @@
#ifndef SCUFENG_MODEL_H_
#define SCUFENG_MODEL_H_
#include <stddef.h>
typedef struct {
float* vertices;
size_t vertices_n;
} Mesh;
typedef struct {
Mesh* meshes;
size_t meshes_n;
} Model;
Model model_load_gltf(const char* path);
#endif // SCUFENG_MODEL_H_
@@ -0,0 +1,9 @@
#ifndef SE_SCUFCONT_IMPL_H_
#define SE_SCUFCONT_IMPL_H_
#include "scufcont/DArray.h"
#include "scufeng/Shape.h"
SCDARRAY_HEADER(SETransform*, SEShapep)
#endif // SE_SCUFCONT_IMPL_H_
@@ -0,0 +1,12 @@
#ifndef SCUFENG_TEXT_H_
#define SCUFENG_TEXT_H_
#include "scufeng/engine.h"
SEResult se_font_load(
const char *path,
const unsigned int pixel_w,
const unsigned int pixel_h
);
#endif // SCUFENG_TEXT_H_
@@ -0,0 +1,15 @@
#ifndef SCUFENG_UTIL_H_
#define SCUFENG_UTIL_H_
#include "cglm/types.h"
int se_rand_int();
bool se_line_segments_intersect(
const vec2 a1,
const vec2 a2,
const vec2 b1,
const vec2 b2,
vec2 ip
);
#endif // SCUFENG_UTIL_H_
Binary file not shown.
+15
View File
@@ -0,0 +1,15 @@
project('scufeng', 'c')
cc = meson.get_compiler('c')
scufeng_lib_dep = cc.find_library(
'scufeng',
dirs: meson.current_source_dir()
)
scufeng_dep = declare_dependency(
dependencies: scufeng_lib_dep,
include_directories: include_directories('include')
)
meson.override_dependency('scufeng', scufeng_dep)