diff options
| author | s-ol <s+removethis@s-ol.nu> | 2021-04-12 12:13:39 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2021-04-12 12:13:39 +0000 |
| commit | e08d4514f8fc489e698261a0dd3cc53f538e36fd (patch) | |
| tree | 24a79bb22f53c07f1e4108490311720d601b80e0 /src/scene.zig | |
| parent | multiple GLTF Models, EXT_MSFT_controller_model support (diff) | |
| download | openxPriments-main.tar.gz openxPriments-main.zip | |
wipmain
Diffstat (limited to '')
| -rw-r--r-- | src/scene.zig | 88 |
1 files changed, 53 insertions, 35 deletions
diff --git a/src/scene.zig b/src/scene.zig index e7fbb5c..b4201b3 100644 --- a/src/scene.zig +++ b/src/scene.zig @@ -1,8 +1,11 @@ const std = @import("std"); +const mem = std.mem; +const Allocator = mem.Allocator; const dg = @import("diligent"); const glm = @import("glm"); const graphics = @import("graphics.zig"); usingnamespace @import("xrvk.zig"); +const math = @import("math.zig"); const geometry_source = \\layout(triangles, invocations = 2) in; @@ -66,9 +69,9 @@ const CameraAttribs = packed struct { .view = view, .proj = proj, .viewproj = viewproj, - .view_inv = view.transpose(), - .proj_inv = proj.transpose(), - .viewproj_inv = viewproj.transpose(), + .view_inv = view.invert() orelse unreachable, + .proj_inv = proj.invert() orelse unreachable, + .viewproj_inv = viewproj.invert() orelse unreachable, }; } @@ -126,29 +129,6 @@ const LightAttribs = packed struct { shadow_attribs: ShadowMapAttribs = .{}, }; -fn vec2vec(v: xr.Vector3f) glm.Vec3 { - return glm.Vec3.init([_]f32{ v.x, v.y, v.z }); -} - -fn quat2mat(q: xr.Quaternionf) glm.Mat4 { - const x = q.x; - const y = q.y; - const z = q.z; - const w = q.w; - const x2 = q.x * q.x; - const y2 = q.y * q.y; - const z2 = q.z * q.z; - - // zig fmt: off - return glm.Mat4.init([_][4]f32{ - [_]f32{ 1 - 2 * y2 - 2 * z2, 2 * x * y - 2 * z * w, 2 * x * z + 2 * y * w, 0 }, - [_]f32{ 2 * x * y + 2 * z * w, 1 - 2 * x2 - 2 * z2, 2 * y * z - 2 * x * w, 0 }, - [_]f32{ 2 * x * z - 2 * y * w, 2 * y * z + 2 * x * w, 1 - 2 * x2 - 2 * y2, 0 }, - [_]f32{ 0, 0, 0, 1 }, - }); - // zig fmt: on -} - const defaultSampler = dg.SamplerDesc{ ._DeviceObjectAttribs = .{ .Name = "Default Sampler" }, .MinFilter = dg.FILTER_TYPE_LINEAR, @@ -174,6 +154,9 @@ pub const Model = struct { bindings: dg.GLTF_ModelResourceBindings, params: dg.GLTF_RenderInfo, + node_indices: std.ArrayList(u32), + node_transforms: std.ArrayList(Transform), + const DEFAULT_PARAMS = dg.GLTF_RenderInfo{ .ModelTransform = @bitCast([16]f32, glm.Mat4.IDENTITY), .AlphaModes = dg.ALPHA_MODE_FLAG_ALL, @@ -186,7 +169,14 @@ pub const Model = struct { .WhitePoint = 3, }; - pub fn initMemory(scene: *const Scene, data: []const u8) Model { + pub const Transform = extern struct { + position: glm.Vec3, + scale: glm.Vec3, + rotation: glm.Vec4, + matrix: glm.Mat4, + }; + + pub fn initMemory(allocator: *Allocator, scene: *const Scene, data: []const u8) Model { const model = dg.Diligent_IGLTFModel_Create( @ptrCast(*dg.IRenderDevice, scene.dev.ptr), scene.ctx.ptr, @@ -209,10 +199,13 @@ pub const Model = struct { scene.light_ubo.ptr, ), .params = DEFAULT_PARAMS, + + .node_indices = std.ArrayList(u32).init(allocator), + .node_transforms = std.ArrayList(Transform).init(allocator), }; } - pub fn initFile(scene: *const Scene, path: [:0]const u8) Model { + pub fn initFile(allocator: *Allocator, scene: *const Scene, path: [:0]const u8) Model { const model = dg.Diligent_IGLTFModel_Create( @ptrCast(*dg.IRenderDevice, scene.dev.ptr), scene.ctx.ptr, @@ -235,12 +228,17 @@ pub const Model = struct { scene.light_ubo.ptr, ), .params = DEFAULT_PARAMS, + + .node_indices = std.ArrayList(u32).init(allocator), + .node_transforms = std.ArrayList(Transform).init(allocator), }; } pub fn deinit(self: *Model) void { self.bindings.Release(); self.model.Release(); + self.node_transforms.deinit(); + self.node_indices.deinit(); } pub fn setTransform(self: *Model, mat: glm.Mat4) void { @@ -257,6 +255,26 @@ pub const Model = struct { scene.resource_binding.ptr, ); } + + pub fn loadNodeTransform(self: *Model, name: [:0]const u8) !void { + var index: u32 = undefined; + if (self.model.GetNodeIndex(name.ptr, &index)) { + try self.node_indices.append(index); + const transform = try self.node_transforms.addOne(); + const ptr = @intToPtr(?*dg.GLTF_Transform, @ptrToInt(transform)); + self.model.GetNodeTransform(index, ptr); + } else { + return error.NodeNotFound; + } + } + + pub fn flushTransforms(self: *Model) void { + for (self.node_indices.items) |index, i| { + const ptr = @intToPtr(?*dg.GLTF_Transform, @ptrToInt(&self.node_transforms.items[i])); + self.model.SetNodeTransform(index, ptr); + } + self.model.UpdateTransforms(); + } }; pub const Scene = struct { @@ -493,12 +511,12 @@ pub const Scene = struct { for (self.views) |*view, i| { const fov = views[i].fov; const viewport = self.viewports[i]; - const fovY = fov.angle_up - fov.angle_down; - const aspect = viewport.Width / viewport.Height; - view.projection = glm.perspective(fovY, aspect, 0.1, 100); - - const pose = views[i].pose; - view.modelview = quat2mat(pose.orientation).mul(glm.translation(vec2vec(pose.position).mulScalar(-1))); + // const fovY = fov.angle_up - fov.angle_down; + // const fovX = fov.angle_right - fov.angle_left; + // const aspect = viewport.Width / viewport.Height; + // view.projection = glm.perspective(fovX, aspect, 0.1, 100); + view.projection = math.projection(fov, 0.1, 100); + view.modelview = math.pose2matInverse(views[i].pose); } try self.updateBufferSlice(ViewUBO, self.views_ubo, self.views); @@ -676,7 +694,7 @@ pub const Scene = struct { var data: [*c]T = null; self.ctx.MapBuffer(buffer.ptr, dg.MAP_WRITE, dg.MAP_FLAG_DISCARD, @ptrCast([*c]?*c_void, &data)); if (data) |ptr| { - std.mem.copy(T, data[0..values.len], values); + mem.copy(T, data[0..values.len], values); self.ctx.UnmapBuffer(buffer.ptr, dg.MAP_WRITE); } else { return error.MapFailed; |
