summaryrefslogtreecommitdiffstats
path: root/src/scene.zig
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2021-04-12 12:13:39 +0000
committers-ol <s+removethis@s-ol.nu>2021-04-12 12:13:39 +0000
commite08d4514f8fc489e698261a0dd3cc53f538e36fd (patch)
tree24a79bb22f53c07f1e4108490311720d601b80e0 /src/scene.zig
parentmultiple GLTF Models, EXT_MSFT_controller_model support (diff)
downloadopenxPriments-main.tar.gz
openxPriments-main.zip
wipmain
Diffstat (limited to '')
-rw-r--r--src/scene.zig88
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;