Add collision for stairs

This commit is contained in:
codemob-dev 2025-07-28 10:57:04 -04:00
parent ea7dec4a01
commit e736f17c4a
5 changed files with 37 additions and 12 deletions

View File

@ -289,7 +289,7 @@ pub fn createBlockModel(_: Block, modeData: *u16, zon: ZonElement) ModelIndex {
}
}
const index = main.models.Model.init(quads.items);
const index = main.models.Model.init(quads.items, null);
if(i == 0) {
modelIndex = index;
}

View File

@ -169,7 +169,7 @@ pub fn createBlockModel(_: Block, _: *u16, _: ZonElement) ModelIndex {
quads.append(rotateQuad(pattern, neighbor));
}
const index = main.models.Model.init(quads.items);
const index = main.models.Model.init(quads.items, null);
if(i == 0) {
modelIndex = index;
}

View File

@ -40,7 +40,7 @@ pub fn createBlockModel(_: Block, _: *u16, zon: ZonElement) ModelIndex {
quadList.items[i + len].textureSlot += 16;
quadList.items[i].opaqueInLod = 2;
}
const modelIndex = main.models.Model.init(quadList.items);
const modelIndex = main.models.Model.init(quadList.items, null);
modelCache = modelIndex;
return modelIndex;
}

View File

@ -14,7 +14,9 @@ const Mat4f = vec.Mat4f;
const Vec2f = vec.Vec2f;
const Vec3f = vec.Vec3f;
const Vec3i = vec.Vec3i;
const Vec3d = vec.Vec3d;
const ZonElement = main.ZonElement;
const AABB = main.game.collision.AABB;
var modelIndex: ?ModelIndex = null;
@ -234,7 +236,26 @@ pub fn createBlockModel(_: Block, _: *u16, _: ZonElement) ModelIndex {
});
}
}
const index = main.models.Model.init(quads.items);
var collision = main.globalAllocator.alloc(AABB, 8);
var hasBrokenParts = false;
for(0..8) |j| {
const x: u1 = @intCast(j & 0b001);
const y: u1 = @intCast((j & 0b010) >> 1);
const z: u1 = @intCast((j & 0b100) >> 2);
if(hasSubBlock(@intCast(i), x, y, z)) {
const minX = @as(f64, @floatFromInt(x)) * 0.5;
const minY = @as(f64, @floatFromInt(y)) * 0.5;
const minZ = @as(f64, @floatFromInt(z)) * 0.5;
const maxX = minX + 0.5;
const maxY = minY + 0.5;
const maxZ = minZ + 0.5;
collision[j] = AABB {.min = Vec3d{minX, minY, minZ}, .max = Vec3d{maxX, maxY, maxZ}};
} else {
hasBrokenParts = true;
}
}
const index = main.models.Model.init(quads.items, if(hasBrokenParts) collision else null);
if(i == 0) {
modelIndex = index;
}

View File

@ -124,7 +124,7 @@ pub const Model = struct {
return @popCount(@as(u3, @bitCast(hasTwoOnes))) == 2 and @popCount(@as(u3, @bitCast(hasTwoZeroes))) == 2;
}
pub fn init(quadInfos: []const QuadInfo) ModelIndex {
pub fn init(quadInfos: []const QuadInfo, collision: ?[]AABB) ModelIndex {
const adjustedQuads = main.stackAllocator.alloc(QuadInfo, quadInfos.len);
defer main.stackAllocator.free(adjustedQuads);
for(adjustedQuads, quadInfos) |*dest, *src| {
@ -197,8 +197,12 @@ pub const Model = struct {
self.allNeighborsOccluded = self.allNeighborsOccluded and self.isNeighborOccluded[neighbor];
self.noNeighborsOccluded = self.noNeighborsOccluded and !self.isNeighborOccluded[neighbor];
}
self.collision = main.globalAllocator.alloc(AABB, 1);
self.collision[0] = AABB {.min = @floatCast(self.min), .max = @floatCast(self.max)};
if(collision)|realCollision| {
self.collision = realCollision;
} else {
self.collision = main.globalAllocator.alloc(AABB, 1);
self.collision[0] = AABB {.min = @floatCast(self.min), .max = @floatCast(self.max)};
}
return modelIndex;
}
@ -235,7 +239,7 @@ pub const Model = struct {
quad.cornerUV[i] = @as(Vec2f, quad.cornerUV[i]) - minUv;
}
}
return Model.init(quadInfos);
return Model.init(quadInfos, null);
}
pub fn loadRawModelDataFromObj(allocator: main.heap.NeverFailingAllocator, data: []const u8) []QuadInfo {
@ -415,7 +419,7 @@ pub const Model = struct {
for(modelList) |model| {
model.model().getRawFaces(&quadList);
}
return Model.init(quadList.items);
return Model.init(quadList.items, null);
}
pub fn transformModel(model: Model, transformFunction: anytype, transformFunctionParameters: anytype) ModelIndex {
@ -425,7 +429,7 @@ pub const Model = struct {
for(quadList.items) |*quad| {
@call(.auto, transformFunction, .{quad} ++ transformFunctionParameters);
}
return Model.init(quadList.items);
return Model.init(quadList.items, null);
}
fn appendQuadsToList(quadList: []const QuadIndex, list: *main.ListUnmanaged(FaceData), allocator: NeverFailingAllocator, block: main.blocks.Block, x: i32, y: i32, z: i32, comptime backFace: bool) void {
@ -581,7 +585,7 @@ pub fn init() void {
nameToIndex = .init(main.globalAllocator.allocator);
nameToIndex.put("none", Model.init(&.{})) catch unreachable;
nameToIndex.put("none", Model.init(&.{}, null)) catch unreachable;
}
pub fn reset() void {
@ -593,7 +597,7 @@ pub fn reset() void {
extraQuadInfos.clearRetainingCapacity();
quadDeduplication.clearRetainingCapacity();
nameToIndex.clearRetainingCapacity();
nameToIndex.put("none", Model.init(&.{})) catch unreachable;
nameToIndex.put("none", Model.init(&.{}, null)) catch unreachable;
}
pub fn deinit() void {