Added console object
This commit is contained in:
parent
68af570278
commit
cc960812ec
|
|
@ -0,0 +1,81 @@
|
||||||
|
const ConsoleFunc = *const fn (args: []const u8) void;
|
||||||
|
|
||||||
|
pub const ConsoleCommand = struct {
|
||||||
|
func: ConsoleFunc,
|
||||||
|
command: []u8,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Console = struct {
|
||||||
|
pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This());
|
||||||
|
|
||||||
|
allocator: std.mem.Allocator,
|
||||||
|
stringArena: std.heap.ArenaAllocator,
|
||||||
|
|
||||||
|
commandMap: std.StringHashMapUnmanaged(ConsoleCommand) = .{},
|
||||||
|
|
||||||
|
pub fn create(allocator: std.mem.Allocator) !*@This() {
|
||||||
|
const self = try allocator.create(@This());
|
||||||
|
self.* = .{
|
||||||
|
.stringArena = std.heap.ArenaAllocator.init(allocator),
|
||||||
|
.allocator = allocator,
|
||||||
|
};
|
||||||
|
|
||||||
|
core.engine_logs("console system created");
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn addConsoleCommand(self: *@This(), funcName: []const u8, func: ConsoleFunc) !void {
|
||||||
|
try self.commandMap.put(self.allocator, funcName, .{
|
||||||
|
.command = try self.stringArena.allocator().dupe(u8, funcName),
|
||||||
|
.func = func,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn eval(self: *@This(), c: []const u8) void {
|
||||||
|
var i: usize = 0;
|
||||||
|
const command = core.stringStrip(c);
|
||||||
|
|
||||||
|
while (i < command.len) : (i += 1) {
|
||||||
|
if (command[i] == ' ') {
|
||||||
|
const func = command[0..i];
|
||||||
|
if (self.commandMap.get(func)) |entry| {
|
||||||
|
entry.func(core.stringStrip(command[i..]));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
core.console_log("unable to run console command: {s}", .{command});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// run the command solo
|
||||||
|
if (self.commandMap.get(command)) |entry| {
|
||||||
|
entry.func("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn destroy(self: *@This()) void {
|
||||||
|
self.stringArena.deinit();
|
||||||
|
self.commandMap.deinit(self.allocator);
|
||||||
|
self.allocator.destroy(self);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var gConsoleObject: *Console = undefined;
|
||||||
|
|
||||||
|
pub fn start() !void {
|
||||||
|
gConsoleObject = try core.createObject(Console, .{});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shutdown() void {}
|
||||||
|
|
||||||
|
pub fn addCommand(funcName: []const u8, func: ConsoleFunc) !void {
|
||||||
|
try gConsoleObject.addConsoleCommand(funcName, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn evaluate(cmd: []const u8) void {
|
||||||
|
gConsoleObject.eval(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
const core = @import("core.zig");
|
||||||
|
const std = @import("std");
|
||||||
|
|
@ -131,6 +131,8 @@ pub fn start_module(comptime programSpec: anytype, args: anytype, allocator: std
|
||||||
gEngine = try allocator.create(Engine);
|
gEngine = try allocator.create(Engine);
|
||||||
gEngine.* = try Engine.init(allocator);
|
gEngine.* = try Engine.init(allocator);
|
||||||
|
|
||||||
|
try console.start();
|
||||||
|
|
||||||
try configVars.setupConfigs(name ++ "Engine.ini");
|
try configVars.setupConfigs(name ++ "Engine.ini");
|
||||||
|
|
||||||
if (@hasField(@TypeOf(args), "unitTest") and args.unitTest) {} else {
|
if (@hasField(@TypeOf(args), "unitTest") and args.unitTest) {} else {
|
||||||
|
|
@ -163,6 +165,7 @@ pub fn shutdown_module(_: std.mem.Allocator) void {
|
||||||
// LUA BEGIN
|
// LUA BEGIN
|
||||||
script.shutdown_lua();
|
script.shutdown_lua();
|
||||||
// LUA END
|
// LUA END
|
||||||
|
console.shutdown();
|
||||||
algorithm.string_pool.shutdown();
|
algorithm.string_pool.shutdown();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -236,6 +239,8 @@ pub const modules = @import("modules.zig");
|
||||||
pub const isModuleEnabled = modules.isModuleEnabled;
|
pub const isModuleEnabled = modules.isModuleEnabled;
|
||||||
pub const ModuleDescription = modules.ModuleDescription;
|
pub const ModuleDescription = modules.ModuleDescription;
|
||||||
|
|
||||||
|
pub const console = @import("console.zig");
|
||||||
|
|
||||||
pub const configVars = @import("configVars.zig");
|
pub const configVars = @import("configVars.zig");
|
||||||
|
|
||||||
pub const getConfigVar = configVars.getConfigVar;
|
pub const getConfigVar = configVars.getConfigVar;
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,14 @@ pub fn ui_logs(comptime fmt: []const u8) void {
|
||||||
printInner("[UI ]: " ++ fmt ++ "\n", .{});
|
printInner("[UI ]: " ++ fmt ++ "\n", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn console_log(comptime fmt: []const u8, args: anytype) void {
|
||||||
|
printInner("[CONSOLE ]: " ++ fmt ++ "\n", args);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn console_logs(comptime fmt: []const u8) void {
|
||||||
|
printInner("[CONSOLE ]: " ++ fmt ++ "\n");
|
||||||
|
}
|
||||||
|
|
||||||
pub fn engine_log(comptime fmt: []const u8, args: anytype) void {
|
pub fn engine_log(comptime fmt: []const u8, args: anytype) void {
|
||||||
printInner("[ENGINE ]: " ++ fmt ++ "\n", args);
|
printInner("[ENGINE ]: " ++ fmt ++ "\n", args);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,9 @@ test "simple systems setup for core" {
|
||||||
|
|
||||||
engine_logs("systems started, shutting down");
|
engine_logs("systems started, shutting down");
|
||||||
memory.MTPrintStatsDelta();
|
memory.MTPrintStatsDelta();
|
||||||
|
|
||||||
try test_loadingConfigs();
|
try test_loadingConfigs();
|
||||||
|
try test_consoleCommands();
|
||||||
|
|
||||||
try memory.dumpTimeline("test-core-timeline.txt");
|
try memory.dumpTimeline("test-core-timeline.txt");
|
||||||
}
|
}
|
||||||
|
|
@ -46,3 +48,21 @@ fn test_loadingConfigs() !void {
|
||||||
core.engine_log("config string: {s}", .{height});
|
core.engine_log("config string: {s}", .{height});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_consoleCommands() !void {
|
||||||
|
const ConsoleCommands = struct {
|
||||||
|
pub fn echo(args: []const u8) void {
|
||||||
|
core.engine_log("{s}", .{args});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn foo(args: []const u8) void {
|
||||||
|
core.engine_log("foo function called with args {s}", .{args});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try core.console.addCommand("echo", ConsoleCommands.echo);
|
||||||
|
try core.console.addCommand("foo", ConsoleCommands.foo);
|
||||||
|
|
||||||
|
core.console.evaluate("echo lmfao");
|
||||||
|
core.console.evaluate("foo lmfao");
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -68,14 +68,6 @@ pub const Renderer = struct {
|
||||||
// transients DO NOT TOUCH
|
// transients DO NOT TOUCH
|
||||||
swapchainTexture: ?*gpu.GPUTexture = undefined,
|
swapchainTexture: ?*gpu.GPUTexture = undefined,
|
||||||
|
|
||||||
// skyboxMesh: ?rend.IndexedMesh = null,
|
|
||||||
// skyboxTexture: ?*rend.Texture = null,
|
|
||||||
// skyboxTextureName: ?core.Name = null,
|
|
||||||
// skyboxPipeline: *gpu.GPUGraphicsPipeline = undefined,
|
|
||||||
// skyboxColor: core.colors.Color = .{ .r = 71.0 / 256.0, .g = 200.0 / 256.0, .b = 1.0, .a = 1.0 },
|
|
||||||
|
|
||||||
// skyboxMeshName: core.Name = core.DefineName("m_skybox"),
|
|
||||||
|
|
||||||
pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This());
|
pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This());
|
||||||
|
|
||||||
pub const MaxObjectCount = 50000;
|
pub const MaxObjectCount = 50000;
|
||||||
|
|
@ -148,50 +140,6 @@ pub const Renderer = struct {
|
||||||
try self.createShadowCastingPipeline();
|
try self.createShadowCastingPipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn setupSkybox(self: *@This()) !void {
|
|
||||||
// try assets.load(
|
|
||||||
// assets.MakeImportRefOptions(
|
|
||||||
// "Mesh",
|
|
||||||
// "m_skybox",
|
|
||||||
// .{ .path = "meshes/skybox.obj" },
|
|
||||||
// ),
|
|
||||||
// );
|
|
||||||
|
|
||||||
// try self.createSkyboxPipeline();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// pub fn createSkyboxPipeline(self: *@This()) !void {
|
|
||||||
// const vertex = try self.loadShader("skybox.vert", skybox_vert.LoadArgs);
|
|
||||||
// const fragment = try self.loadShader("skybox.frag", skybox_frag.LoadArgs);
|
|
||||||
|
|
||||||
// var pci = std.mem.zeroes(gpu.GPUGraphicsPipelineCreateInfo);
|
|
||||||
// pci.vertex_shader = vertex;
|
|
||||||
// pci.fragment_shader = fragment;
|
|
||||||
|
|
||||||
// var attributes = try self.generateVertexAttributeList();
|
|
||||||
// defer attributes.deinit();
|
|
||||||
|
|
||||||
// pci.vertex_input_state = .{
|
|
||||||
// .num_vertex_buffers = 1,
|
|
||||||
// .vertex_buffer_descriptions = &[_]gpu.GPUVertexBufferDescription{
|
|
||||||
// .{ .slot = 0, .pitch = @sizeOf(rend.MeshVertex), .input_rate = .vertexinputrateVertex, .instance_step_rate = 0 },
|
|
||||||
// },
|
|
||||||
// .num_vertex_attributes = @intCast(attributes.items.len),
|
|
||||||
// .vertex_attributes = @ptrCast(attributes.items.ptr),
|
|
||||||
// };
|
|
||||||
|
|
||||||
// pci.target_info.num_color_targets = 1;
|
|
||||||
// pci.target_info.color_target_descriptions = &[_]gpu.GPUColorTargetDescription{
|
|
||||||
// .{
|
|
||||||
// .format = self.device.getGPUSwapchainTextureFormat(self.window),
|
|
||||||
// .blend_state = std.mem.zeroes(gpu.GPUColorTargetBlendState),
|
|
||||||
// },
|
|
||||||
// };
|
|
||||||
|
|
||||||
// pci.rasterizer_state.fill_mode = .fillmodeFill;
|
|
||||||
// self.skyboxPipeline = self.device.createGPUGraphicsPipeline(&pci);
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn createSamplers(self: *@This()) !void {
|
pub fn createSamplers(self: *@This()) !void {
|
||||||
core.engine_log("creating blocky sampler", .{});
|
core.engine_log("creating blocky sampler", .{});
|
||||||
self.blockySampler = self.device.createGPUSampler(&std.mem.zeroInit(gpu.GPUSamplerCreateInfo, .{
|
self.blockySampler = self.device.createGPUSampler(&std.mem.zeroInit(gpu.GPUSamplerCreateInfo, .{
|
||||||
|
|
@ -652,37 +600,6 @@ pub const Renderer = struct {
|
||||||
self.skyboxSystem.render(cmd);
|
self.skyboxSystem.render(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
// render the skybox
|
|
||||||
// {
|
|
||||||
// if (self.skyboxMesh == null) {
|
|
||||||
// self.skyboxMesh = getMeshByName(&self.skyboxMeshName);
|
|
||||||
// }
|
|
||||||
// if (self.skyboxTexture == null) {
|
|
||||||
// if (self.skyboxTextureName) |*name| {
|
|
||||||
// self.skyboxTexture = getTexture(name);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (self.skyboxTexture) |skyboxTexture| {
|
|
||||||
// if (self.skyboxMesh) |skyboxMesh| {
|
|
||||||
// const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{
|
|
||||||
// .texture = self.swapchainTexture.?,
|
|
||||||
// .clear_color = self.skyboxColor,
|
|
||||||
// .load_op = .loadopClear,
|
|
||||||
// .store_op = .storeopStore,
|
|
||||||
// });
|
|
||||||
//
|
|
||||||
// const renderpass = cmd.beginGPURenderPass(&targetInfo, 1, null);
|
|
||||||
//
|
|
||||||
// self.uploadSkyboxUniforms(cmd);
|
|
||||||
// renderpass.bindGPUGraphicsPipeline(self.skyboxPipeline);
|
|
||||||
// renderpass.bindGPUFragmentSamplers(0, &.{ .texture = skyboxTexture.texture, .sampler = self.blockySampler }, 1);
|
|
||||||
// renderpass.drawGPUIndexedPrimitives(skyboxMesh.index.size, 1, skyboxMesh.index.start, @intCast(skyboxMesh.vertex.start), 0);
|
|
||||||
// renderpass.endGPURenderPass();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// can cache this
|
// can cache this
|
||||||
const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{
|
const targetInfo: gpu.GPUColorTargetInfo = std.mem.zeroInit(gpu.GPUColorTargetInfo, .{
|
||||||
.texture = self.swapchainTexture.?,
|
.texture = self.swapchainTexture.?,
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ pub const BumpArena = @import("structures/bump-arena.zig").BumpArena;
|
||||||
pub const dupeString = utils.dupeString;
|
pub const dupeString = utils.dupeString;
|
||||||
pub const xxd = @import("utils/xxd.zig");
|
pub const xxd = @import("utils/xxd.zig");
|
||||||
|
|
||||||
|
pub const stringStrip = utils.stringStrip;
|
||||||
pub const xxdWrite = xxd.xxdWrite;
|
pub const xxdWrite = xxd.xxdWrite;
|
||||||
|
|
||||||
pub const loadFileAlloc = utils.loadFileAlloc;
|
pub const loadFileAlloc = utils.loadFileAlloc;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@ const std = @import("std");
|
||||||
// - substring()
|
// - substring()
|
||||||
// - split()
|
// - split()
|
||||||
// - fmt()
|
// - fmt()
|
||||||
|
//
|
||||||
|
// main purpose of this string-pool is to provide an RC-ableinterface for interface
|
||||||
|
// with GC'ed systems such as lua
|
||||||
|
|
||||||
var gStringContext: *StringContext = undefined;
|
var gStringContext: *StringContext = undefined;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -149,3 +149,21 @@ pub fn getFileExtension(path: []const u8) []const u8 {
|
||||||
}
|
}
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// removes whitespace from start and end
|
||||||
|
pub fn stringStrip(p: []const u8) []const u8 {
|
||||||
|
var s: usize = 0;
|
||||||
|
while (s < p.len) : (s += 1) {
|
||||||
|
if (!std.ascii.isWhitespace(p[s])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var e: usize = p.len;
|
||||||
|
while (e > 0) : (e -= 1) {
|
||||||
|
if (!std.ascii.isWhitespace(p[e - 1])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return p[s..e];
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue