89 lines
3.3 KiB
Zig
89 lines
3.3 KiB
Zig
pub const PhysicsCharacter = struct {
|
|
entity: core.Entity = undefined,
|
|
|
|
// character: *zphysics.CharacterVirtual = undefined,
|
|
character: *zphysics.Character = undefined,
|
|
bodyId: BodyId = undefined,
|
|
|
|
pub fn initECS(self: *@This(), handle: core.SetHandle) void {
|
|
self.entity = core.Entity.fromHandle(handle);
|
|
|
|
if (self.entity.get(PhysicsCollider) != null) {
|
|
@panic("adding a physics character to an entity already controlled by PhysicsCollider. I'm not going to support this");
|
|
}
|
|
|
|
if (self.entity.fetch(core.Scene) == null) {
|
|
@panic("a scene component needs to be created in order to add a physics collider");
|
|
}
|
|
}
|
|
|
|
pub fn setupCharacter(self: *@This(), shapeName: core.Name) !void {
|
|
var n = shapeName;
|
|
const system = physics.gPhysicsRuntime;
|
|
const interface = system.system.getBodyInterfaceMut();
|
|
const shape = system.shapes.get(n.handle()).?;
|
|
|
|
const scene = self.entity.fetch(core.Scene).?;
|
|
const p = scene.getPosition();
|
|
|
|
var settings = try zphysics.CharacterSettings.create();
|
|
defer settings.release();
|
|
// base o
|
|
// up: [4]f32 align(16), // 4th element is ignored
|
|
// supporting_volume: [4]f32 align(16), // JPH::Plane - 4th element is used
|
|
// max_slope_angle: f32,
|
|
// shape: *Shape, // must provide valid shape (such as the typical capsule)
|
|
|
|
settings.base.shape = shape.shape;
|
|
settings.layer = physics.ObjectLayers.moving;
|
|
settings.mass = 70;
|
|
settings.friction = 0.8;
|
|
|
|
self.character = try zphysics.Character.create(settings, .{ p.x, p.y, p.z }, scene.getRotation().quat, 0, system.system);
|
|
|
|
self.character.addToPhysicsSystem(.{});
|
|
self.bodyId = self.character.getBodyId();
|
|
|
|
_ = interface;
|
|
}
|
|
|
|
pub fn update(self: *@This(), dt: f64) void {
|
|
_ = dt;
|
|
// self.character.update(@floatCast(dt), .{ 0, -1.0, 0 }, .{});
|
|
|
|
const scene = self.entity.fetch(core.Scene).?;
|
|
const p = self.character.getPosition();
|
|
// core.debugSphere(position, 20, .{});
|
|
scene.setPosition(.{ .x = p[0], .y = p[1], .z = p[2] });
|
|
}
|
|
|
|
pub fn setVelocity(self: *@This(), v: core.Vectorf) void {
|
|
self.character.setLinearVelocity(.{ v.x, v.y, v.z });
|
|
}
|
|
|
|
pub fn getPosition(self: *@This()) core.Vectorf {
|
|
const p = self.character.getPosition();
|
|
const position: core.Vectorf = .{ .x = p[0], .y = p[1], .z = p[2] };
|
|
|
|
return position;
|
|
}
|
|
|
|
pub fn deinit(self: *@This()) void {
|
|
self.character.removeFromPhysicsSystem(.{});
|
|
self.character.destroy();
|
|
}
|
|
|
|
pub var BaseContainer: *core.SparseMap(PhysicsCharacter) = undefined;
|
|
pub const ComponentName = "PhysicsCharacter";
|
|
pub const ScriptExports: []const []const u8 = &.{};
|
|
};
|
|
|
|
const core = @import("core");
|
|
const zphysics = @import("zphysics");
|
|
const physicsSystem = @import("physicsSystem.zig");
|
|
const PhysicsCollider = physicsSystem.PhysicsCollider;
|
|
const physics = @import("physics.zig");
|
|
const BodyId = physics.BodyId;
|
|
const CharacterVirtualSettings = zphysics.CharacterVirtualSettings;
|
|
const CharacterVirtual = zphysics.CharacterVirtual;
|