Backlog/projects/sampleGame/main.zig

169 lines
4.8 KiB
Zig

allocator: std.mem.Allocator,
camera: core.Entity = undefined,
cameraSpeed: f32 = 100.0,
moveInput: *core.Axis2dBinding = undefined,
moveVector: core.Vectorf = .{},
verticalMove: f32 = 0.0,
pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This());
pub fn init(allocator: std.mem.Allocator) !*@This() {
const self = try allocator.create(@This());
self.* = .{
.allocator = allocator,
};
return self;
}
const assetReferences = [_]assets.AssetImportReference{
assets.MakeImportRefOptions(
"Mesh",
"m_empire",
.{ .path = "meshes/lost_empire.obj" },
),
assets.MakeImportRefOptions(
"Mesh",
"m_fox",
.{ .path = "gltf-samples/Fox/glTF/Fox.gltf" },
),
assets.MakeImportRefOptions(
"Texture",
"t_fox",
.{ .path = "gltf-samples/Fox/glTF/Texture.png" },
),
assets.MakeImportRefOptions(
"Texture",
"t_empire",
.{ .path = "textures/lost_empire-RGBA.png" },
),
};
pub fn prepare(self: *@This()) !void {
core.engine_log(">>>>>>> game prepare", .{});
var z = core.tracy.ZoneN(@src(), "PREPARING GAME");
defer z.End();
try core.fs().addContentPath("sampleGame");
try script.loadTypes("scripts");
try script.runScriptFile("scripts/prepare.lua");
try assets.loadList(assetReferences);
const exitInput = try core.ActionBinding.create(core.MakeName("exit"));
exitInput.addKey(.escape, .keyDown);
_ = exitInput.data.addListener(null, onExit);
exitInput.activate();
self.camera = try core.createEntity();
_ = self.camera.addComponent(core.Scene).?;
const camera = self.camera.addComponent(rend.CameraComponent).?;
{
const lostEmpire = try core.createEntity();
const scene = lostEmpire.addComponent(core.Scene).?;
scene.setPosition(.{ .y = -20 });
const empireMesh = lostEmpire.addComponent(rend.MeshComponent).?;
empireMesh.setMesh("m_empire");
empireMesh.setTexture("t_empire");
}
{
const fox = try core.createEntity();
const scene = fox.addComponent(core.Scene).?;
_ = scene;
// scene.setScale();
const mesh = fox.addComponent(rend.MeshComponent).?;
mesh.setMesh("m_fox");
mesh.setTexture("t_fox");
}
rend.setActiveCamera(camera);
self.moveInput = try core.Axis2dBinding.create(core.MakeName("movement"));
self.moveInput.addKey(.w, 1.0, .y);
self.moveInput.addKey(.s, -1.0, .y);
self.moveInput.addKey(.d, 1.0, .x);
self.moveInput.addKey(.a, -1.0, .x);
_ = self.moveInput.data.addListener(self, onMove);
self.moveInput.activate();
const verticalInput = try core.Axis1dBinding.create(core.MakeName("movementVertical"));
verticalInput.addKey(.e, 1.0);
verticalInput.addKey(.q, -1.0);
_ = verticalInput.data.addListener(self, verticalMovement);
verticalInput.activate();
{
const shaderReload = try core.ActionBinding.create(core.MakeName("shaderReload"));
shaderReload.addKey(.r, .keyDown);
_ = shaderReload.data.addListener(null, onShaderReload);
shaderReload.activate();
}
}
fn onShaderReload(ctx: ?*anyopaque, action: core.ActionEvent) void {
_ = ctx;
_ = action;
core.engine_log("reloading shaders, this is gonna cause some leaks but thats ok", .{});
rend.renderer.reloadShaders() catch unreachable;
}
fn verticalMovement(ctx: ?*anyopaque, axis: f32) void {
const self: *@This() = @ptrCast(@alignCast(ctx));
self.verticalMove = axis;
}
fn onMove(ctx: ?*anyopaque, axis: core.Vector2f) void {
const self: *@This() = @ptrCast(@alignCast(ctx));
self.moveVector = .{ .x = -axis.x, .z = axis.y, .y = 0.0 };
}
pub fn onExit(ctx: ?*anyopaque, action: core.ActionEvent) void {
_ = ctx;
_ = action;
core.exitNow();
}
pub fn tick(self: *@This(), dt: f64) void {
const fdt: f32 = @floatCast(dt);
if (self.camera.fetch(core.Scene)) |scene| {
const vector = core.Vectorf{ .x = self.moveVector.x, .z = self.moveVector.z, .y = self.verticalMove };
scene.getPosRot().position = scene.getPosRot().position.add(vector.fmul(self.cameraSpeed * fdt));
// core.engine_log(" camera position >> {any}", .{scene.getPosRot().position});
}
var show: bool = true;
ig.showDemoWindow(&show);
}
pub fn deinit(self: *@This()) void {
self.allocator.destroy(self);
}
pub fn main() anyerror!void {
try backlog.initializeAndRunStandardProgram(@This(), .{
.name = "SampleGame",
.enabledModules = .{
.imgui = true,
.physics = true,
},
});
}
const std = @import("std");
const backlog = @import("Backlog");
const assets = backlog.assets;
const core = backlog.core;
const ig = backlog.imgui.api;
const rend = backlog.rend;
const script = core.script;