221 lines
4.7 KiB
Odin
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
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|