Skip to content

Latest commit

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Zig build package, bindings and C API for Jolt Physics.

For a simple sample applications please see here.

Getting started

Example build.zig:

pubfnbuild(b: *std.Build) void {
constexe=b.addExecutable(.{ ... });
constzphysics=b.dependency("zphysics", .{
.use_double_precision=false,
.enable_cross_platform_determinism=true,
});
exe.root_module.addImport("zphysics", zphysics.module("root"));
exe.linkLibrary(zphysics.artifact("joltc"));
}

Now in your code you may import and use zphysics:

constzphy=@import("zphysics");
pubfnmain() !void {
tryzphy.init(allocator, .{});
deferzphy.deinit();
// Create physics systemconstphysics_system=tryzphy.PhysicsSystem.create(
...// layer interfaces - please see sample application
.{
.max_bodies=1024,
.num_body_mutexes=0,
.max_body_pairs=1024,
.max_contact_constraints=1024,
},
);
deferphysics_system.destroy();
// Create shapeconstbody_interface=physics_system.getBodyInterfaceMut();
constshape_settings=tryzphy.BoxShapeSettings.create(.{ 1.0, 1.0, 1.0 });
defershape_settings.release();
constshape=tryshape_settings.createShape();
defershape.release();
// Create bodyconstbody_id=trybody_interface.createAndAddBody(.{
.position= .{ 0.0, -1.0, 0.0, 1.0 },
.rotation= .{ 0.0, 0.0, 0.0, 1.0 },
.shape=shape,
.motion_type=.dynamic,
.object_layer=object_layers.non_moving,
}, .activate);
deferbody_interface.removeAndDestroyBody(body_id);
physics_system.optimizeBroadPhase();
// Perform ray cast
{
constquery=physics_system.getNarrowPhaseQuery();
varresult=query.castRay(.{ .origin= .{ 0, 10, 0, 1 }, .direction= .{ 0, -20, 0, 0 } }, .{});
if (result.has_hit) {
// result.hit.body_id// result.hit.fraction// result.hit.sub_shape_id...
}
}
// Main loopwhile (...) {
physics_system.update(1.0/60.0, .{});
// Draw all bodiesconstbodies=physics_system.getBodiesUnsafe();
for (bodies) |body| {
if (!zphy.isValidBodyPointer(body)) continue;
constobject_to_world=object_to_world: {
constposition=zm.loadArr4(body.position);
constrotation=zm.loadArr4(body.rotation);
varxform=zm.matFromQuat(rotation);
xform[3] =position;
xform[3][3] =1.0;
break :object_to_worldxform;
};
// Issue a draw call...
}
}
}

Usage in a shared library

The joltc artifact can be built as a shared library by specifying the shared build option:

 const zphysics = b.dependency("zphysics", .{
.shared = true,
});

If your zig module uses zphysics and is itself part of a shared library that is reloaded at runtime, then some additional steps are required:

  • Before unloading the shared library, call preUnload to export the internal global state
  • After reloading the shared library, call postReload to import the internal state and update allocator vtables

If you use registerTrace or registerAssertFailed, these must also be called again to update their function pointers.

About

Zig build package, bindings and C API (JoltC) for https://github.com/jrouwe/JoltPhysics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages