Continued clay bindings

This commit is contained in:
Stowy 2024-12-31 14:35:03 +01:00
parent f0fec168a2
commit 409bf1c3bf
8 changed files with 780 additions and 26 deletions

View File

@ -1,4 +1,5 @@
.build/
examples/clay_official_website.exe
examples/clay_official_website.pdb
examples/introducing_clay_video_demo/main.exe
examples/introducing_clay_video_demo/main.pdb
examples/introducing_clay_video_demo/main.rdi
source/clay.h

View File

@ -54,9 +54,9 @@ raylib_initialize :: (width: s32, height: s32, $$title: string, flags: Raylib.Co
Raylib.InitWindow(width, height, c_string_title);
}
clay_raylib_render :: (render_commands: *Clay.RenderCommandArray) {
clay_raylib_render :: (render_commands: Clay.RenderCommandArray) {
for 0..render_commands.length - 1 {
render_command := Clay.RenderCommandArray_Get(render_commands, cast(s32) it);
render_command := Clay.RenderCommandArray_Get(*render_commands, cast(s32) it);
bounding_box := render_command.boundingBox;
if #complete render_command.commandType == {

View File

@ -30,7 +30,7 @@ to_jai_string :: (str: Clay.String) -> string {
handle_clay_errors :: (error_data: Clay.ErrorData) #c_call {
push_context {
print("%", to_jai_string(error_data.errorText));
log_error("Clay Error : %", to_jai_string(error_data.errorText));
}
}
@ -39,15 +39,65 @@ main :: () {
raylib_initialize(1024, 768, "Introducing Clay Demo", flags);
clay_required_memory := Clay.MinMemorySize();
clay_memory := Clay.CreateArenaWithCapacityAndMemory(clay_required_memory, alloc(clay_required_memory));
memory := NewArray(clay_required_memory, u8);
clay_memory := Clay.CreateArenaWithCapacityAndMemory(clay_required_memory, memory.data);
Clay.Initialize(
clay_memory,
Clay.Dimensions.{cast(float, Raylib.GetScreenWidth()), cast(float, Raylib.GetScreenHeight())},
.{handle_clay_errors, 0}
);
Clay.SetMeasureTextFunction(raylib_measure_text);
g_raylib_fonts[FONT_ID_BODY_16] = .{
FONT_ID_BODY_16,
Raylib.LoadFontEx("resources/Roboto-Regular.ttf", 48, null, 400),
};
Raylib.SetTextureFilter(g_raylib_fonts[FONT_ID_BODY_16].font.texture, .BILINEAR);
while !Raylib.WindowShouldClose() {
Clay.SetLayoutDimensions(.{
cast(float, Raylib.GetScreenWidth()),
cast(float, Raylib.GetScreenHeight()),
});
mouse_position := Raylib.GetMousePosition();
scroll_delta := Raylib.GetMouseWheelMoveV();
Clay.SetPointerState(mouse_position, Raylib.IsMouseButtonDown(0));
Clay.UpdateScrollContainers(true, scroll_delta, Raylib.GetFrameTime());
layout_expand := Clay.Sizing.{
Clay.SizingGrow(),
Clay.SizingGrow(),
};
content_background_config := Clay.RectangleElementConfig.{
color = .{90, 90, 90, 255},
cornerRadius = .{8, 8, 8, 8},
};
Clay.BeginLayout();
if Clay.UI(
Clay.ID("OuterContainer"),
Clay.Layout(.{
layoutDirection = .TOP_TO_BOTTOM,
sizing = Clay.Sizing.{
Clay.SizingGrow(),
Clay.SizingGrow(),
},
padding = .{16, 16},
childGap = 16,
}),
Clay.Rectangle(.{color = .{43, 41, 51, 255}})
) {
}
render_commands := Clay.EndLayout();
Raylib.BeginDrawing();
Raylib.ClearBackground(Raylib.BLACK);
clay_raylib_render(render_commands);
Raylib.EndDrawing();
}
}

View File

@ -5,13 +5,6 @@ SOURCE_PATH :: "source";
// These have custom declaration in module.jai
DECLARATIONS_TO_OMIT :: string.[
"Clay_Vector2",
// "Clay_Color",
];
// These types must be included because they are referenced by public types
PRIVATE_DECLARATION_TO_INCLUDE :: string.[
"Clay__SizingType",
"Clay__ElementConfigType"
];
#if AT_COMPILE_TIME {
@ -40,7 +33,7 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil
could_copy := FileUtils.copy_file("../../clay.h", "source/clay.h");
if !could_copy then return false;
defer File.file_delete("source/clay.h");
defer if !compile_debug then File.file_delete("source/clay.h");
if compile {
source_file := tprint("%/clay.c", SOURCE_PATH);
@ -49,20 +42,21 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil
#if OS == .WINDOWS {
File.make_directory_if_it_does_not_exist("clay-jai/windows", true);
// success &&= BuildCpp.build_cpp_static_lib("clay-jai/windows/clay", source_file, extra=.["/w"], debug=compile_debug);
command := ifx compile_debug {
write_string("Compiling debug...\n");
Process.break_command_into_strings("clang -g -gcodeview -c source\\clay.c");
} else {
write_string("Compiling release...\n");
Process.break_command_into_strings("clang -O3 -c source\\clay.c");
}
result := Process.run_command(..command, capture_and_return_output=true, print_captured_output=true);
if result.exit_code != 0 then return false;
defer File.file_delete("clay.o");
command = Process.break_command_into_strings("llvm-ar -rc clay-jai/windows/clay.lib clay.o");
write_string("Linking...\n");
command = Process.break_command_into_strings("llvm-ar -rcs clay-jai/windows/clay.lib clay.o");
result = Process.run_command(..command, capture_and_return_output=true, print_captured_output=true);
// if result.exit_code != 0 then return false;
if result.exit_code != 0 then return false;
} else {
// TODO MacOS
// TODO Linux
@ -70,6 +64,7 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil
}
if !success then return false;
write_string("Succesfully built clay\n");
}
output_filename: string;
@ -108,9 +103,8 @@ clay_visitor :: (decl: *Generator.Declaration, parent_decl: *Generator.Declarati
return .STOP;
}
if String.begins_with(decl.name, "Clay__") && !array_find(PRIVATE_DECLARATION_TO_INCLUDE, decl.name) {
decl.decl_flags |= .OMIT_FROM_OUTPUT;
return .STOP;
if String.begins_with(decl.name, "Clay__") {
decl.output_name = String.slice(decl.name, 5, decl.name.count - 5);
}
}

View File

@ -1,9 +1,50 @@
Vector2 :: Math.Vector2;
make_string :: (str: string) -> String {
return .{cast(u64, str.count), str.data};
}
UI :: (id: ElementId, layout: LayoutConfig, configs: ..ElementConfig, $call := #caller_code) -> bool #must #expand {
_OpenElement();
_AttachId(id);
_AttachLayoutConfig(_StoreLayoutConfig(layout));
for configs _AttachElementConfig(it.config, it.type);
_ElementPostConfiguration();
// TODO Fix the need to have to add the namespace here
#insert,scope(call) #code defer Clay._CloseElement();;
return true;
// `defer _CloseElement();
}
ID :: (label: string, index: u32 = 0) -> ElementId {
return _HashString(make_string(label), index, 0);
}
Layout :: (config: LayoutConfig) -> LayoutConfig {
// We can just return the config because the layout is attached and stored in the UI function
return config;
}
Rectangle :: (config: RectangleElementConfig) -> ElementConfig {
return .{
type = .RECTANGLE,
config.rectangleElementConfig = _StoreRectangleElementConfig(config)
};
}
SizingGrow :: (size_min_max: SizingMinMax = .{}) -> SizingAxis {
return .{type = .GROW, size = .{minMax = size_min_max}};
}
#scope_module
Math :: #import "Math";
Compiler :: #import "Compiler";
ProgramPrint :: #import "Program_Print";
#if OS == .WINDOWS {
#load "windows.jai";

File diff suppressed because it is too large Load Diff