132 lines
4.1 KiB
C
132 lines
4.1 KiB
C
#define DJSTD_BASIC_ENTRY
|
|
|
|
#include "../core.c"
|
|
#include "../gfx/gfx.c"
|
|
|
|
typedef struct WindowData WindowData;
|
|
struct WindowData {
|
|
Renderer *renderer;
|
|
};
|
|
|
|
void windowOnEvent(OS_WindowEvent *e, OS_Window *window) {
|
|
switch (e->kind) {
|
|
case OS_WindowEventKind_Resize: {
|
|
WindowData *data = (WindowData*)window->userData;
|
|
data->renderer->width = e->resize.width;
|
|
data->renderer->height = e->resize.height;
|
|
break;
|
|
};
|
|
default: {
|
|
break;
|
|
};
|
|
}
|
|
}
|
|
|
|
void ui_GreenBox(UI_Context *ui, int32 width, int32 height) {
|
|
UI(.width=width, .height=height, .color=COLOR_GREEN, .padding=UI_PadUniform(10)) {
|
|
UI(.flags=UI_Flag_HeightGrow | UI_Flag_WidthGrow | UI_Flag_Vertical, .childGap=10) {
|
|
UI_SetTxtAttr(.fontSize=40, .alignment=UI_TxtAlign_Center);
|
|
UI_Rect box = UI_RectAttr(.flags=UI_Flag_WidthGrow | UI_Flag_HeightGrow, .color=COLOR_RED);
|
|
UI_Rect boxHover = box;
|
|
boxHover.color = COLOR_BLUE;
|
|
UI_AttachTxtAttr(&box, UI_TxtAttr(.color=COLOR_CYAN));
|
|
UI_AttachTxtAttr(&boxHover, UI_TxtAttr(.color=COLOR_YELLOW));
|
|
|
|
UI(.flags=UI_Flag_HeightGrow | UI_Flag_WidthGrow, .childGap=10) {
|
|
UI_FromRect(ui_HoverRect(ui, box, boxHover)) {
|
|
UI_Txt(s("A"));
|
|
}
|
|
UI_FromRect(ui_HoverRect(ui, box, boxHover)) {
|
|
UI_Txt(s("B"));
|
|
}
|
|
}
|
|
|
|
UI(.flags=UI_Flag_HeightGrow | UI_Flag_WidthGrow, .childGap=10) {
|
|
UI_FromRect(ui_HoverRect(ui, box, boxHover)) {
|
|
UI_Txt(s("C"));
|
|
}
|
|
UI_FromRect(ui_HoverRect(ui, box, boxHover)) {
|
|
UI_Txt(s("D"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ui_Main(UI_Context *ui, int32 width, int32 height) {
|
|
UI(.flags=UI_Flag_HeightGrow | UI_Flag_WidthGrow, .padding=UI_PadUniform(10), .childGap=10) {
|
|
ui_GreenBox(ui, width, height);
|
|
ui_GreenBox(ui, width, height);
|
|
ui_GreenBox(ui, width, height);
|
|
ui_GreenBox(ui, width, height);
|
|
ui_GreenBox(ui, width, height);
|
|
}
|
|
}
|
|
|
|
int djstd_entry(Arena *arena, StringList args) {
|
|
WindowData windowData = {
|
|
.renderer=NULL,
|
|
};
|
|
|
|
Arena *uiArena = arenaAlloc(Megabytes(128));
|
|
|
|
OS_WindowInitResult windowInit = os_windowInit(arena, (OS_WindowInitParams){
|
|
.name=s("Hello DJ Stdlib Graphics"),
|
|
.width=800,
|
|
.height=600,
|
|
.data=&windowData,
|
|
.eventHandler=windowOnEvent,
|
|
});
|
|
|
|
if (!windowInit.valid) {
|
|
return 1;
|
|
}
|
|
|
|
OS_Window *window = windowInit.result;
|
|
|
|
Scene mainScene = createScene(arena);
|
|
Camera cam = createCamera(window->width, window->height);
|
|
|
|
Font kodeMono = createFont(arena, s("./gfx/assets/fonts/KodeMono.ttf"), 96);
|
|
Shader phongShader = createShader(s("./gfx/assets/shaders/phong.vertex.glsl"), s("./gfx/assets/shaders/phong.fragment.glsl"));
|
|
Shader solidShader = createShader(s("./gfx/assets/shaders/rect.vertex.glsl"), s("./gfx/assets/shaders/rect.fragment.glsl"));
|
|
Shader textShader = createShader(s("./gfx/assets/shaders/text.vertex.glsl"), s("./gfx/assets/shaders/text.fragment.glsl"));
|
|
|
|
Renderer renderer = createRenderer(arena, &mainScene, &cam, createSceneGraphNode(&mainScene));
|
|
UI_Context ui = ui_initContext(uiArena, &renderer);
|
|
|
|
renderer.phongShader = &phongShader;
|
|
renderer.solidShader = &solidShader;
|
|
renderer.textShader = &textShader;
|
|
renderer.activeFont = &kodeMono;
|
|
windowData.renderer = &renderer;
|
|
|
|
OS_Input currInput = {0};
|
|
OS_Input prevInput = {0};
|
|
|
|
while (!os_windowShouldClose(window)) {
|
|
os_windowFrameBegin(window);
|
|
|
|
prevInput = currInput;
|
|
os_windowGetInput(window, &currInput);
|
|
ui.input = &currInput;
|
|
|
|
Render(&renderer) {
|
|
// Render graphics shit
|
|
|
|
UI_Pass(&ui) {
|
|
ui_Main(&ui);
|
|
}
|
|
}
|
|
|
|
if (currInput.keyboard.escape) {
|
|
break;
|
|
}
|
|
|
|
os_windowSwapBuffers(window);
|
|
os_windowFrameEnd(window);
|
|
}
|
|
|
|
return 0;
|
|
}
|