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 }