Files
Edit2D/box2d_draw.odin
2026-03-28 13:42:24 +05:45

221 lines
4.7 KiB
Odin

package edit2d
import e2_draw "./draw"
import b2 "vendor:box2d"
import "base:runtime"
/*
This is the integration between box2d and engine's renderer
*/
/* Put the functions to the box2d debug_draw */
make_rgba :: proc(color : b2.HexColor, alpha : f32) -> e2_draw.RGBA8 {
c := i32(color)
return {
u8((c >> 16) & 0xFF),
u8((c >> 8) & 0xFF),
u8(c & 0xFF),
u8(0xFF * alpha),
}
}
make_hex_color :: proc(rgba: e2_draw.RGBA8) -> b2.HexColor {
return b2.HexColor((u32(rgba.r) << 16) | (u32(rgba.g) << 8) | u32(rgba.b))
}
DrawCircleFcn :: proc "c" (
center : [2]f32,
radius : f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
e2_draw.circle_add(&draw.circles, center, radius, rgba)
}
DrawSolidCircleFcn :: proc "c" (
transform : b2.Transform,
radius : f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
transform := transform
transform.p = b2.TransformPoint(transform, {0, 0})
t := transmute(e2_draw.Transform)transform
rgba := make_rgba(color, 1.0)
e2_draw.DrawSolidCircle(
&draw.solid_circles,
t,
{0, 0},
radius,
rgba,
)
}
DrawSolidCapsuleFcn :: proc "c" (
p1, p2 : [2]f32,
radius : f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
e2_draw.solid_capsules_add(&draw.solid_capsules, p1, p2, radius, rgba)
}
DrawSegmentFcn :: proc "c" (
p1, p2 : [2]f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
e2_draw.lines_add(&draw.lines, p1, p2, rgba)
}
DrawTransform :: proc "c" (lines : ^e2_draw.Lines, transform : b2.Transform) {
context = runtime.default_context()
k_axis_scale : f32 = 0.2
p1 := transform.p
rgba_red := make_rgba(b2.HexColor.Red, 1.0)
rgba_green := make_rgba(b2.HexColor.Green, 1.0)
p2 := p1 + k_axis_scale * b2.Rot_GetXAxis(transform.q)
e2_draw.lines_add(lines, p1, p2, rgba_red)
p2 = p1 + k_axis_scale * b2.Rot_GetYAxis(transform.q)
e2_draw.lines_add(lines, p1, p2, rgba_green)
}
DrawTransformFcn :: proc "c" (transform : b2.Transform, ctx : rawptr) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
DrawTransform(&draw.lines, transform)
}
DrawSolidPolygonFcn :: proc "c" (
transform : b2.Transform,
vertices : [^][2]f32,
vertexCount : i32,
radius : f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
t := transmute(e2_draw.Transform)transform
draw := cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
e2_draw.solid_polygon_add(
&draw.polygons,
t,
vertices,
vertexCount,
radius,
rgba,
)
}
DrawPolygonFcn :: proc "c" (vertices : [^][2]f32, vertexCount : i32, color : b2.HexColor, ctx : rawptr)
{
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
p1 := vertices[vertexCount - 1]
for i in 0 ..< vertexCount
{
p2 := vertices[i]
e2_draw.lines_add(&draw.lines, p1, vertices[i], rgba)
p1 = p2
}
}
DrawStringFcn :: proc "c" (
p : [2]f32,
s : cstring,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw := cast(^e2_draw.Draw)ctx
e2_draw.DrawStringVec(draw, p, s)
}
DrawPointFcn :: proc "c" (
p : [2]f32,
size : f32,
color : b2.HexColor,
ctx : rawptr,
) {
context = runtime.default_context()
draw :=cast(^e2_draw.Draw)ctx
rgba := make_rgba(color, 1.0)
e2_draw.points_add(&draw.points, p, size, rgba)
}
//After initilizing draw
draw_configure_box2d :: proc(state: ^Engine_State)
{
debug_draw := &state.debug_draw
bounds : b2.AABB = {{-max(f32), -max(f32)}, {max(f32), max(f32)}}
debug_draw.DrawPolygonFcn = DrawPolygonFcn
debug_draw.DrawSolidPolygonFcn = DrawSolidPolygonFcn
debug_draw.DrawCircleFcn = DrawCircleFcn
debug_draw.DrawSolidCircleFcn = DrawSolidCircleFcn
debug_draw.DrawSolidCapsuleFcn = DrawSolidCapsuleFcn
debug_draw.DrawSegmentFcn = DrawSegmentFcn
debug_draw.DrawTransformFcn = DrawTransformFcn
debug_draw.DrawPointFcn = DrawPointFcn
debug_draw.DrawStringFcn = DrawStringFcn
debug_draw.drawingBounds = bounds
debug_draw.useDrawingBounds = false
debug_draw.drawShapes = true
debug_draw.drawJoints = true
debug_draw.drawJointExtras = false
debug_draw.drawBounds = false
debug_draw.drawMass = true
debug_draw.drawContacts = false
debug_draw.drawGraphColors = false
debug_draw.drawContactNormals = false
debug_draw.drawContactImpulses = false
debug_draw.drawContactFeatures = false
debug_draw.drawFrictionImpulses = false
debug_draw.drawIslands = false
debug_draw.userContext = rawptr(&state.draw)
state.draw.drawCounters = true
}