mirror of
https://github.com/nicbarker/clay.git
synced 2025-04-18 20:28:01 +00:00
Draft odin bindings
This commit is contained in:
parent
fd45138d57
commit
4efd7c5651
3
bindings/odin/.gitignore
vendored
Normal file
3
bindings/odin/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
odin
|
||||||
|
odin.dSYM
|
||||||
|
.vscode
|
0
bindings/odin/README.md
Normal file
0
bindings/odin/README.md
Normal file
BIN
bindings/odin/clay-odin/clay.a
Normal file
BIN
bindings/odin/clay-odin/clay.a
Normal file
Binary file not shown.
246
bindings/odin/clay-odin/clay.odin
Normal file
246
bindings/odin/clay-odin/clay.odin
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
package clay
|
||||||
|
|
||||||
|
import "core:c"
|
||||||
|
import "core:fmt"
|
||||||
|
foreign import Clay "clay.a"
|
||||||
|
|
||||||
|
String :: struct {
|
||||||
|
length: c.int,
|
||||||
|
chars: [^]c.char,
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 :: struct {
|
||||||
|
x: c.float,
|
||||||
|
y: c.float,
|
||||||
|
}
|
||||||
|
|
||||||
|
Dimensions :: struct {
|
||||||
|
width: c.float,
|
||||||
|
height: c.float,
|
||||||
|
}
|
||||||
|
|
||||||
|
Arena :: struct {
|
||||||
|
label: String,
|
||||||
|
nextAllocation: c.uint64_t,
|
||||||
|
capacity: c.uint64_t,
|
||||||
|
memory: [^]c.char,
|
||||||
|
}
|
||||||
|
|
||||||
|
BoundingBox :: struct {
|
||||||
|
x: c.float,
|
||||||
|
y: c.float,
|
||||||
|
width: c.float,
|
||||||
|
height: c.float,
|
||||||
|
}
|
||||||
|
|
||||||
|
Color :: struct {
|
||||||
|
r: c.float,
|
||||||
|
g: c.float,
|
||||||
|
b: c.float,
|
||||||
|
a: c.float,
|
||||||
|
}
|
||||||
|
|
||||||
|
CornerRadius :: struct {
|
||||||
|
topLeft: c.float,
|
||||||
|
topRight: c.float,
|
||||||
|
bottomLeft: c.float,
|
||||||
|
bottomRight: c.float,
|
||||||
|
}
|
||||||
|
|
||||||
|
Border :: struct {
|
||||||
|
width: c.uint32_t,
|
||||||
|
color: Color,
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderCommandType :: enum u8 {
|
||||||
|
None,
|
||||||
|
Rectangle,
|
||||||
|
Border,
|
||||||
|
Text,
|
||||||
|
Image,
|
||||||
|
ScissorStart,
|
||||||
|
ScissorEnd,
|
||||||
|
Custom,
|
||||||
|
}
|
||||||
|
|
||||||
|
RectangleElementConfig :: struct {
|
||||||
|
color: Color,
|
||||||
|
cornerRadius: CornerRadius,
|
||||||
|
}
|
||||||
|
|
||||||
|
TextElementConfig :: struct {
|
||||||
|
textColor: Color,
|
||||||
|
fontId: c.uint16_t,
|
||||||
|
fontSize: c.uint16_t,
|
||||||
|
letterSpacing: c.uint16_t,
|
||||||
|
lineSpacing: c.uint16_t,
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageElementConfig :: struct {
|
||||||
|
imageData: rawptr,
|
||||||
|
sourceDimensions: Dimensions,
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomElementConfig :: struct {
|
||||||
|
customData: rawptr,
|
||||||
|
}
|
||||||
|
|
||||||
|
BorderContainerElementConfig :: struct {
|
||||||
|
left: Border,
|
||||||
|
right: Border,
|
||||||
|
top: Border,
|
||||||
|
bottom: Border,
|
||||||
|
betweenChildren: Border,
|
||||||
|
cornerRadius: CornerRadius,
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollContainerElementConfig :: struct {
|
||||||
|
horizontal: c.bool,
|
||||||
|
vertical: c.bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
ElementConfigUnion :: struct #raw_union {
|
||||||
|
rectangleElementConfig: ^RectangleElementConfig,
|
||||||
|
textElementConfig: ^TextElementConfig,
|
||||||
|
imageElementConfig: ^ImageElementConfig,
|
||||||
|
customElementConfig: ^CustomElementConfig,
|
||||||
|
borderContainerElementConfig: ^BorderContainerElementConfig,
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderCommand :: struct {
|
||||||
|
boundingBox: BoundingBox,
|
||||||
|
config: ElementConfigUnion,
|
||||||
|
text: String,
|
||||||
|
id: c.uint32_t,
|
||||||
|
commandType: RenderCommandType,
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderCommandArray :: struct {
|
||||||
|
capacity: c.uint32_t,
|
||||||
|
length: c.uint32_t,
|
||||||
|
internalArray: [^]RenderCommand,
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollContainerData :: struct {
|
||||||
|
// Note: This is a pointer to the real internal scroll position, mutating it may cause a change in final layout.
|
||||||
|
// Intended for use with external functionality that modifies scroll position, such as scroll bars or auto scrolling.
|
||||||
|
scrollPosition: ^Vector2,
|
||||||
|
scrollContainerDimensions: Dimensions,
|
||||||
|
contentDimensions: Dimensions,
|
||||||
|
config: ScrollContainerElementConfig,
|
||||||
|
// Indicates whether an actual scroll container matched the provided ID or if the default struct was returned.
|
||||||
|
found: c.bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
SizingType :: enum u8 {
|
||||||
|
FIT,
|
||||||
|
GROW,
|
||||||
|
PERCENT,
|
||||||
|
}
|
||||||
|
|
||||||
|
SizingAxis :: struct {
|
||||||
|
// Note: `min` is used for CLAY_SIZING_PERCENT, slightly different to clay.h due to lack of C anonymous unions
|
||||||
|
min: c.float,
|
||||||
|
max: c.float,
|
||||||
|
type: SizingType,
|
||||||
|
}
|
||||||
|
|
||||||
|
Sizing :: struct {
|
||||||
|
width: SizingAxis,
|
||||||
|
height: SizingAxis,
|
||||||
|
}
|
||||||
|
|
||||||
|
Padding :: struct {
|
||||||
|
x: c.uint16_t,
|
||||||
|
y: c.uint16_t,
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutDirection :: enum u8 {
|
||||||
|
LEFT_TO_RIGHT,
|
||||||
|
TOP_TO_BOTTOM,
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutAlignmentX :: enum u8 {
|
||||||
|
LEFT,
|
||||||
|
RIGHT,
|
||||||
|
CENTER,
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutAlignmentY :: enum u8 {
|
||||||
|
TOP,
|
||||||
|
BOTTOM,
|
||||||
|
CENTER,
|
||||||
|
}
|
||||||
|
|
||||||
|
ChildAlignment :: struct {
|
||||||
|
x: LayoutAlignmentX,
|
||||||
|
y: LayoutAlignmentY,
|
||||||
|
}
|
||||||
|
|
||||||
|
LayoutConfig :: struct {
|
||||||
|
sizing: Sizing,
|
||||||
|
padding: Padding,
|
||||||
|
childGap: c.uint16_t,
|
||||||
|
layoutDirection: LayoutDirection,
|
||||||
|
childAlignment: ChildAlignment,
|
||||||
|
}
|
||||||
|
|
||||||
|
foreign Clay {
|
||||||
|
Clay_MinMemorySize :: proc() -> c.uint32_t ---
|
||||||
|
Clay_CreateArenaWithCapacityAndMemory :: proc(capacity: c.uint32_t, offset: [^]u8) -> Arena ---
|
||||||
|
Clay_SetPointerPosition :: proc(position: Vector2) ---
|
||||||
|
Clay_Initialize :: proc(arena: Arena) ---
|
||||||
|
Clay_UpdateScrollContainers :: proc(isPointerActive: c.bool, scrollDelta: Vector2, deltaTime: c.float) ---
|
||||||
|
Clay_BeginLayout :: proc(screenWidth: c.int, screenHeight: c.int) ---
|
||||||
|
Clay_EndLayout :: proc(screenWidth: c.int, screenHeight: c.int) -> RenderCommandArray ---
|
||||||
|
Clay_PointerOver :: proc(id: c.uint32_t) -> c.bool ---
|
||||||
|
Clay_GetScrollContainerData :: proc(id: c.uint32_t) -> ScrollContainerData ---
|
||||||
|
Clay__CloseContainerElement :: proc() ---
|
||||||
|
Clay__OpenRectangleElement :: proc(id: c.uint32_t, layoutConfig: ^LayoutConfig, rectangleConfig: ^RectangleElementConfig) ---
|
||||||
|
}
|
||||||
|
|
||||||
|
MinMemorySize :: proc() -> c.uint32_t {
|
||||||
|
return Clay_MinMemorySize()
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateArenaWithCapacityAndMemory :: proc(capacity: c.uint32_t, offset: [^]u8) -> Arena {
|
||||||
|
return Clay_CreateArenaWithCapacityAndMemory(capacity, offset)
|
||||||
|
}
|
||||||
|
|
||||||
|
SetPointerPosition :: proc(position: Vector2) {
|
||||||
|
Clay_SetPointerPosition(position)
|
||||||
|
}
|
||||||
|
|
||||||
|
Initialize :: proc(arena: Arena) {
|
||||||
|
Clay_Initialize(arena)
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateScrollContainers :: proc(isPointerActive: c.bool, scrollDelta: Vector2, deltaTime: c.float) {
|
||||||
|
Clay_UpdateScrollContainers(isPointerActive, scrollDelta, deltaTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
BeginLayout :: proc(screenWidth: c.int, screenHeight: c.int) {
|
||||||
|
Clay_BeginLayout(screenWidth, screenHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
EndLayout :: proc(screenWidth: c.int, screenHeight: c.int) -> RenderCommandArray {
|
||||||
|
return Clay_EndLayout(screenWidth, screenHeight)
|
||||||
|
}
|
||||||
|
|
||||||
|
PointerOver :: proc(id: c.uint32_t) -> c.bool {
|
||||||
|
return Clay_PointerOver(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
GetScrollContainerData :: proc(id: c.uint32_t) -> ScrollContainerData {
|
||||||
|
return Clay_GetScrollContainerData(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
@(deferred_none = Clay__CloseContainerElement)
|
||||||
|
Rectangle :: proc(
|
||||||
|
id: c.uint32_t,
|
||||||
|
layoutConfig: ^LayoutConfig,
|
||||||
|
rectangleConfig: ^RectangleElementConfig,
|
||||||
|
) -> bool {
|
||||||
|
Clay__OpenRectangleElement(id, layoutConfig, rectangleConfig)
|
||||||
|
return true
|
||||||
|
}
|
28
bindings/odin/main.odin
Normal file
28
bindings/odin/main.odin
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import clay "clay-odin"
|
||||||
|
import "core:c"
|
||||||
|
import "core:fmt"
|
||||||
|
|
||||||
|
main :: proc() {
|
||||||
|
minMemorySize: c.uint32_t = clay.MinMemorySize()
|
||||||
|
memory := make([^]u8, minMemorySize)
|
||||||
|
arena: clay.Arena = clay.CreateArenaWithCapacityAndMemory(minMemorySize, memory)
|
||||||
|
clay.Initialize(arena)
|
||||||
|
clay.BeginLayout(1024, 768)
|
||||||
|
layoutConfig: clay.LayoutConfig = clay.LayoutConfig {
|
||||||
|
sizing = {width = {type = clay.SizingType.GROW}, height = {type = clay.SizingType.GROW}},
|
||||||
|
padding = {16, 16},
|
||||||
|
}
|
||||||
|
rectangleConfig: clay.RectangleElementConfig = clay.RectangleElementConfig {
|
||||||
|
cornerRadius = {topLeft = 5},
|
||||||
|
}
|
||||||
|
|
||||||
|
if clay.Rectangle(1, &layoutConfig, &rectangleConfig) {
|
||||||
|
if clay.Rectangle(1, &layoutConfig, &rectangleConfig) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
renderCommands: clay.RenderCommandArray = clay.EndLayout(1024, 768)
|
||||||
|
}
|
6
bindings/odin/ols.json
Normal file
6
bindings/odin/ols.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json",
|
||||||
|
"enable_document_symbols": true,
|
||||||
|
"enable_hover": true,
|
||||||
|
"enable_snippets": true
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user