This commit is contained in:
Peter Li 2025-05-03 11:19:50 -07:00
parent 98a2f6577f
commit 9837556c1c
10 changed files with 177 additions and 85 deletions

View File

@ -240,6 +240,11 @@ float4 main(
+ col * BlinnPhong(Normal, WorldPos, lightPos, lightColor) + col * BlinnPhong(Normal, WorldPos, lightPos, lightColor)
+ col * DirectionalLight(Normal, WorldPos, DirectionalShadowFragPos); + col * DirectionalLight(Normal, WorldPos, DirectionalShadowFragPos);
if((texMode & 0x2) > 0) // full bright no lighting bit
{
c2 = col;
}
float4 rv = float4(pow(c2, 1.0 / 2.2), alpha); float4 rv = float4(pow(c2, 1.0 / 2.2), alpha);

View File

@ -9,14 +9,11 @@ texture: ?*Texture = null,
entity: core.Entity = undefined, entity: core.Entity = undefined,
textureMode: u32 = 0, // bit textureMode: ComponentTextureMode = .{}, // bit
// DEBUG for-fun function, completely override what happens when the renderer tries to render this mesh. // DEBUG for-fun function, completely override what happens when the renderer tries to render this mesh.
cmrf: ?rend.renderer.CustomMeshRenderFunc = null, cmrf: ?rend.renderer.CustomMeshRenderFunc = null,
cmrf_ctx: ?*anyopaque = null, cmrf_ctx: ?*anyopaque = null,
pub const textureMode_default = 0;
pub const textureMode_videoYUV = 0x10;
pub var BaseContainer: *MeshSet = undefined; pub var BaseContainer: *MeshSet = undefined;
pub const ComponentName = "Mesh"; pub const ComponentName = "Mesh";
@ -25,6 +22,22 @@ pub const ScriptExports: []const []const u8 = &.{
// "setTexture", // "setTexture",
}; };
pub const ComponentTextureMode = packed struct(u32) {
// 0 - 3
noSrgb: bool = false,
fullbright: bool = false,
pad1: bool = false,
pad2: bool = false,
// 4 - 8
samplerMode: enum(u4) {
simple = 0,
videoYUV = 1,
} = .simple,
rsvd: u24 = 0,
};
pub fn initECS(self: *@This(), handle: core.SetHandle) void { pub fn initECS(self: *@This(), handle: core.SetHandle) void {
// get the mesh component // get the mesh component
self.entity = core.Entity{ .handle = handle }; self.entity = core.Entity{ .handle = handle };

View File

@ -392,7 +392,7 @@ pub const Renderer = struct {
transform = repr.transform; transform = repr.transform;
} }
uploadMapped[i].Model = @bitCast(transform); uploadMapped[i].Model = @bitCast(transform);
uploadMapped[i].textureMode = object.textureMode; uploadMapped[i].textureMode = @bitCast(object.textureMode);
} }
} }

View File

@ -8,6 +8,10 @@ texture: *gpu.GPUTexture = undefined,
width: u32, width: u32,
height: u32, height: u32,
inputEnabled: bool = false,
sensitivity: f32 = 1.0,
fn log(comptime fmt: []const u8, args: anytype) void { fn log(comptime fmt: []const u8, args: anytype) void {
core.engine_log("[Doomplayer] " ++ fmt, args); core.engine_log("[Doomplayer] " ++ fmt, args);
} }
@ -24,6 +28,7 @@ pub fn create(allocator: std.mem.Allocator) !*@This() {
try self.setup(); try self.setup();
self.sensitivity = core.configVar(f32, "doomplayer.sensitivity", 1.0);
gDoom = self; gDoom = self;
return self; return self;
@ -43,6 +48,22 @@ pub fn setup(self: *@This()) !void {
c.doom_init(1, @constCast(@ptrCast(@alignCast(&.{"doom"}))), 8); c.doom_init(1, @constCast(@ptrCast(@alignCast(&.{"doom"}))), 8);
} }
fn sdlToDoomButton(button: c_uint) c_uint {
switch (button) {
sdl3_c.SDL_BUTTON_LEFT => {
return c.DOOM_LEFT_BUTTON;
},
sdl3_c.SDL_BUTTON_RIGHT => {
return c.DOOM_RIGHT_BUTTON;
},
sdl3_c.SDL_BUTTON_MIDDLE => {
return c.DOOM_MIDDLE_BUTTON;
},
else => {},
}
return 0;
}
fn sdlToDoomScancode(sdlScancode: c_uint) c_int { fn sdlToDoomScancode(sdlScancode: c_uint) c_int {
switch (sdlScancode) { switch (sdlScancode) {
sdl3_c.SDL_SCANCODE_TAB => { sdl3_c.SDL_SCANCODE_TAB => {
@ -271,16 +292,22 @@ fn sdlToDoomScancode(sdlScancode: c_uint) c_int {
var gDoom: *@This() = undefined; var gDoom: *@This() = undefined;
pub fn processFunc(e: *sdl3.Event) void { pub fn processFunc(e: *sdl3.Event) void {
if (!gDoom.inputEnabled) {
return;
}
switch (e.type) { switch (e.type) {
else => {}, else => {},
sdl3_c.SDL_EVENT_MOUSE_MOTION => { sdl3_c.SDL_EVENT_MOUSE_MOTION => {
c.doom_mouse_move(@intFromFloat(e.motion.xrel * 4), @intFromFloat(e.motion.yrel * 4)); c.doom_mouse_move(@intFromFloat(e.motion.xrel * 4 * gDoom.sensitivity), @intFromFloat(e.motion.yrel * 4 * gDoom.sensitivity));
}, },
sdl3_c.SDL_EVENT_MOUSE_BUTTON_DOWN => { sdl3_c.SDL_EVENT_MOUSE_BUTTON_DOWN => {
c.doom_key_down(sdlToDoomScancode(e.button.button)); log("pushing mouse button down to doom {d}", .{e.button.button});
c.doom_button_down(sdlToDoomButton(e.button.button));
}, },
sdl3_c.SDL_EVENT_MOUSE_BUTTON_UP => { sdl3_c.SDL_EVENT_MOUSE_BUTTON_UP => {
c.doom_key_down(sdlToDoomScancode(e.button.button)); log("pushing mouse button up to doom {d}", .{e.button.button});
c.doom_button_up(sdlToDoomButton(e.button.button));
}, },
sdl3_c.SDL_EVENT_KEY_DOWN => { sdl3_c.SDL_EVENT_KEY_DOWN => {
if (!e.key.repeat) { if (!e.key.repeat) {
@ -373,6 +400,13 @@ pub fn tick(self: *@This(), dt: f64) void {
const cmd = rend.context().device.acquireGPUCommandBuffer(); const cmd = rend.context().device.acquireGPUCommandBuffer();
self.releaseAndUploadFrameBuffer(cmd); self.releaseAndUploadFrameBuffer(cmd);
_ = cmd.submitGPUCommandBuffer(); _ = cmd.submitGPUCommandBuffer();
if (self.inputEnabled) {
if (ig.begin("doom settings", null, .{})) {
_ = ig.sliderFloat("sensitivity", &self.sensitivity, 0.1, 20, null, .{});
ig.end();
}
}
} }
fn bindVideoTextures(p: ?*anyopaque) void { fn bindVideoTextures(p: ?*anyopaque) void {
@ -397,7 +431,8 @@ pub fn createEntity(self: *@This()) !core.Entity {
if (entity.addComponent(rend.MeshComponent)) |mesh| { if (entity.addComponent(rend.MeshComponent)) |mesh| {
mesh.cmrf = bindVideoTextures; mesh.cmrf = bindVideoTextures;
mesh.cmrf_ctx = self; mesh.cmrf_ctx = self;
mesh.textureMode = 0x1; mesh.textureMode.fullbright = true;
mesh.textureMode.noSrgb = true;
mesh.setMesh("m_plane"); mesh.setMesh("m_plane");
} }
return entity; return entity;

View File

@ -267,7 +267,7 @@ pub fn createVideoPlayerEntity(self: *@This()) !core.Entity {
if (entity.addComponent(rend.MeshComponent)) |mesh| { if (entity.addComponent(rend.MeshComponent)) |mesh| {
mesh.cmrf = bindVideoTextures; mesh.cmrf = bindVideoTextures;
mesh.cmrf_ctx = self; mesh.cmrf_ctx = self;
mesh.textureMode = 0x10; mesh.textureMode.samplerMode = .videoYUV;
mesh.setMesh("m_plane"); mesh.setMesh("m_plane");
} }
return entity; return entity;

View File

@ -47,101 +47,101 @@ struct main0_in
fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], texture2d<float> Texture0 [[texture(0)]], texture2d<float> Texture1 [[texture(1)]], texture2d<float> Texture2 [[texture(2)]], texture2d<float> DirectionalShadowDepthMap [[texture(3)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]], sampler Sampler2 [[sampler(2)]], sampler DirectionalShadowSampler [[sampler(3)]]) fragment main0_out main0(main0_in in [[stage_in]], constant type_Uniforms& Uniforms [[buffer(0)]], const device type_StructuredBuffer_Scene& scene [[buffer(1)]], texture2d<float> Texture0 [[texture(0)]], texture2d<float> Texture1 [[texture(1)]], texture2d<float> Texture2 [[texture(2)]], texture2d<float> DirectionalShadowDepthMap [[texture(3)]], sampler Sampler0 [[sampler(0)]], sampler Sampler1 [[sampler(1)]], sampler Sampler2 [[sampler(2)]], sampler DirectionalShadowSampler [[sampler(3)]])
{ {
main0_out out = {}; main0_out out = {};
int _97 = int(scene._m0[in.in_var_TEXCOORD4].textureMode); int _98 = int(scene._m0[in.in_var_TEXCOORD4].textureMode);
int _98 = _97 & 240; int _99 = _98 & 240;
float4 _132; float4 _133;
if (_98 == 16) if (_99 == 16)
{ {
float3 _119 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5); float3 _120 = float3(Texture0.sample(Sampler0, in.in_var_TEXCOORD0).x, Texture1.sample(Sampler1, in.in_var_TEXCOORD0).x, Texture2.sample(Sampler2, in.in_var_TEXCOORD0).x) + float3(-0.0625, -0.5, -0.5);
_132 = float4(dot(_119, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_119, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_119, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0); _133 = float4(dot(_120, float3(1.164000034332275390625, 0.0, 1.7929999828338623046875)), dot(_120, float3(1.164000034332275390625, -0.212999999523162841796875, -0.53299999237060546875)), dot(_120, float3(1.164000034332275390625, 2.111999988555908203125, 0.0)), 1.0);
} }
else else
{ {
float4 _131; float4 _132;
if (_98 == 0) if (_99 == 0)
{ {
_131 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0); _132 = Texture0.sample(Sampler0, in.in_var_TEXCOORD0);
} }
else else
{ {
_131 = _86; _132 = _86;
} }
_132 = _131; _133 = _132;
} }
float4 _138; float4 _139;
if ((_97 & 1) == 1) if ((_98 & 1) == 1)
{ {
_138 = powr(_132, float4(2.2000000476837158203125)); _139 = powr(_133, float4(2.2000000476837158203125));
} }
else else
{ {
_138 = _132; _139 = _133;
} }
if (_138.w < 0.00999999977648258209228515625) if (_139.w < 0.00999999977648258209228515625)
{ {
discard_fragment(); discard_fragment();
} }
float3 _192; float3 _193;
do do
{ {
float3 _149 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1; float3 _150 = Uniforms.lightPosition.xyz - in.in_var_TEXCOORD1;
float _150 = length(_149); float _151 = length(_150);
float _151 = _150 * _150; float _152 = _151 * _151;
float _157; float _158;
if (_150 > 2.0) if (_151 > 2.0)
{ {
_157 = 0.5 / _151; _158 = 0.5 / _152;
} }
else else
{ {
_157 = 1.0 / _151; _158 = 1.0 / _152;
} }
float _162; float _163;
if (_150 > 4.0) if (_151 > 4.0)
{ {
_162 = _157 * 0.5; _163 = _158 * 0.5;
} }
else else
{ {
_162 = _157; _163 = _158;
} }
float _164 = (_150 > 15.0) ? 0.0 : _162; float _165 = (_151 > 15.0) ? 0.0 : _163;
float _166 = (_164 > 1.0) ? 1.0 : _164; float _167 = (_165 > 1.0) ? 1.0 : _165;
if (length(in.in_var_TEXCOORD2) < 0.100000001490116119384765625) if (length(in.in_var_TEXCOORD2) < 0.100000001490116119384765625)
{ {
_192 = (in.in_var_TEXCOORD1 * float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5)) * _166; _193 = (in.in_var_TEXCOORD1 * float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5)) * _167;
break; break;
} }
float3 _173 = fast::normalize(_149); float3 _174 = fast::normalize(_150);
_192 = ((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_173, in.in_var_TEXCOORD2), 0.0)) * _166) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_173 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _166); _193 = ((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * precise::max(dot(_174, in.in_var_TEXCOORD2), 0.0)) * _167) + (((float3(0.800000011920928955078125, 0.800000011920928955078125, 0.5) * powr(precise::max(dot(in.in_var_TEXCOORD2, fast::normalize(_174 + fast::normalize(in.in_var_TEXCOORD1 - Uniforms.viewPos.xyz))), 0.0), 30.0)) * 2.0) * _167);
break; break;
} while(false); } while(false);
float3 _209 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5); float3 _210 = ((in.in_var_TEXCOORD3.xyz / float3(in.in_var_TEXCOORD3.w)) * 0.5) + float3(0.5);
float3 _211; float3 _212;
_211.x = _209.x; _212.x = _210.x;
float2 _212 = _211.xy; float2 _213 = _212.xy;
_212.y = -_209.y; _213.y = -_210.y;
float _219;
int _222;
int _224;
_219 = 0.0;
_222 = 0;
_224 = -4;
float _220; float _220;
int _223; int _223;
for (; _224 <= 4; _219 = _220, _222 = _223, _224++) int _225;
_220 = 0.0;
_223 = 0;
_225 = -4;
float _221;
int _224;
for (; _225 <= 4; _220 = _221, _223 = _224, _225++)
{ {
_223 = _222; _224 = _223;
_220 = _219; _221 = _220;
for (int _233 = -4; _233 <= 4; ) for (int _234 = -4; _234 <= 4; )
{ {
_223++; _224++;
_220 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_212 + float2(float(_233) * 0.000244140625, float(_224) * 0.000244140625))).x); _221 += float((in.in_var_TEXCOORD3.z - 0.004999999888241291046142578125) > DirectionalShadowDepthMap.sample(DirectionalShadowSampler, (_213 + float2(float(_234) * 0.000244140625, float(_225) * 0.000244140625))).x);
_233++; _234++;
continue; continue;
} }
} }
out.out_var_SV_Target0 = float4(powr(_138.xyz * ((float3(0.100000001490116119384765625) + _192) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_219 / float(_222))))), float3(0.4545454680919647216796875)), _138.w); out.out_var_SV_Target0 = float4(powr(select(_139.xyz * ((float3(0.100000001490116119384765625) + _193) + ((Uniforms.directionalLightColor.xyz * precise::max(dot(Uniforms.directionalLight.xyz, in.in_var_TEXCOORD2), 0.0)) * (1.0 - (_220 / float(_223))))), _139.xyz, bool3((_98 & 2) > 0)), float3(0.4545454680919647216796875)), _139.w);
return out; return out;
} }

View File

@ -2,3 +2,6 @@
name="Sample Game" name="Sample Game"
width=1920 width=1920
height=1080 height=1080
[doom]
sensitivity=6.0

View File

@ -20,6 +20,12 @@ doomplayer: *DoomPlayer = undefined,
videoplayerObject: core.Entity = undefined, videoplayerObject: core.Entity = undefined,
doomplayerObject: core.Entity = undefined, doomplayerObject: core.Entity = undefined,
inputEnabled: bool = true,
videoFullbright: bool = false,
moveLight: bool = true,
pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This()); pub var NeonObjectTable: core.EngineObjectVTable = core.EngineObjectVTable.from(@This());
pub fn init(allocator: std.mem.Allocator) !*@This() { pub fn init(allocator: std.mem.Allocator) !*@This() {
@ -56,21 +62,21 @@ const assetReferences = [_]assets.AssetImportReference{
"t_empire", "t_empire",
.{ .path = "textures/lost_empire-RGBA.png" }, .{ .path = "textures/lost_empire-RGBA.png" },
), ),
// assets.MakeImportRefOptions( assets.MakeImportRefOptions(
// "Texture", "Texture",
// "t_skybox", "t_skybox",
// .{ .{
// .textureCube = true, .textureCube = true,
// .textureList = &.{ .textureList = &.{
// "sky_air/cube_right.png", // cubemapfacePositivex, right "sky_air/cube_right.png", // cubemapfacePositivex, right
// "sky_air/cube_left.png", // cubemapfacePositivex, right "sky_air/cube_left.png", // cubemapfacePositivex, right
// "sky_air/cube_up.png", // cubemapfacePositivex, right "sky_air/cube_up.png", // cubemapfacePositivex, right
// "sky_air/cube_down.png", // cubemapfacePositivex, right "sky_air/cube_down.png", // cubemapfacePositivex, right
// "sky_air/cube_back.png", // cubemapfacePositivex, right "sky_air/cube_back.png", // cubemapfacePositivex, right
// "sky_air/cube_front.png", // cubemapfacePositivex, right "sky_air/cube_front.png", // cubemapfacePositivex, right
// }, },
// }, },
// ), ),
}; };
pub fn prepare(self: *@This()) !void { pub fn prepare(self: *@This()) !void {
@ -89,7 +95,7 @@ pub fn prepare(self: *@This()) !void {
self.doomplayer = try DoomPlayer.create(self.allocator); self.doomplayer = try DoomPlayer.create(self.allocator);
self.doomplayerObject = try self.doomplayer.createEntity(); self.doomplayerObject = try self.doomplayer.createEntity();
// rend.setSkyboxTexture("t_skybox"); rend.setSkyboxTexture("t_skybox");
const exitInput = try core.ActionBinding.create(core.MakeName("exit")); const exitInput = try core.ActionBinding.create(core.MakeName("exit"));
exitInput.addKey(.escape, .keyDown); exitInput.addKey(.escape, .keyDown);
@ -181,6 +187,13 @@ pub fn prepare(self: *@This()) !void {
shaderReload.activate(); shaderReload.activate();
} }
{
const input = try core.ActionBinding.create(core.MakeName("toggleDoom"));
input.addKey(.f2, .keyDown);
_ = input.data.addListener(self, toggleDoom);
input.activate();
}
{ {
const input = try core.ActionBinding.create(core.MakeName("toggleMouseLook")); const input = try core.ActionBinding.create(core.MakeName("toggleMouseLook"));
input.addKey(.t, .keyDown); input.addKey(.t, .keyDown);
@ -193,7 +206,17 @@ pub fn prepare(self: *@This()) !void {
fn onMouseLook(ctx: ?*anyopaque, axis: core.Vector2f) void { fn onMouseLook(ctx: ?*anyopaque, axis: core.Vector2f) void {
const self: *@This() = @ptrCast(@alignCast(ctx)); const self: *@This() = @ptrCast(@alignCast(ctx));
self.fpcamera.addMouseMovement(axis); if (self.inputEnabled) {
self.fpcamera.addMouseMovement(axis);
}
}
fn toggleDoom(ctx: ?*anyopaque, action: core.ActionEvent) void {
const self: *@This() = @ptrCast(@alignCast(ctx));
_ = action;
self.doomplayer.inputEnabled = !self.doomplayer.inputEnabled;
self.inputEnabled = !self.doomplayer.inputEnabled;
} }
fn toggleMouseLook(ctx: ?*anyopaque, action: core.ActionEvent) void { fn toggleMouseLook(ctx: ?*anyopaque, action: core.ActionEvent) void {
@ -276,24 +299,37 @@ pub fn tick(self: *@This(), dt: f64) void {
var movement = self.fpcamera.getForwardXZ().fmul(self.moveVector.z * fdt * self.cameraSpeed); var movement = self.fpcamera.getForwardXZ().fmul(self.moveVector.z * fdt * self.cameraSpeed);
movement = movement.add(self.fpcamera.getRightXZ().fmul(self.moveVector.x * fdt * self.cameraSpeed)); movement = movement.add(self.fpcamera.getRightXZ().fmul(self.moveVector.x * fdt * self.cameraSpeed));
movement = movement.add(.{ .y = self.verticalMove * fdt * self.cameraSpeed }); movement = movement.add(.{ .y = self.verticalMove * fdt * self.cameraSpeed });
const pos = self.fpcamera.getPosition().add(movement);
self.fpcamera.setPosition(pos);
self.centerDist += self.centerDistMove * fdt; self.centerDist += self.centerDistMove * fdt;
const pos = self.fpcamera.getPosition().add(movement);
if (self.inputEnabled) {
self.fpcamera.setPosition(pos);
}
self.fpcamera.resolve(); self.fpcamera.resolve();
const forward = self.fpcamera.getForward(); const forward = self.fpcamera.getForward();
const debugCenter = self.fpcamera.getPosition().add(forward.fmul(self.centerDist)); const debugCenter = self.fpcamera.getPosition().add(forward.fmul(self.centerDist));
core.debugSphere(debugCenter, 0.3, .{}); if (self.moveLight) {
core.debugSphere(debugCenter, 0.1, .{ .color = .{ .x = 1.0 } }); core.debugSphere(debugCenter, 0.3, .{});
core.debugSphere(debugCenter, 0.1, .{ .color = .{ .x = 1.0 } });
rend.context().lightPosition = debugCenter; rend.context().lightPosition = debugCenter;
}
// show a window with the current camera's position // show a window with the current camera's position
if (ig.begin("meh", &self.showWindow, .{})) { if (ig.begin("meh", &self.showWindow, .{})) {
ig.textFmt("x:{d:.03} y:{d:.03} z:{d:.03}", .{ pos.x, pos.y, pos.z }) catch return; ig.textFmt("x:{d:.03} y:{d:.03} z:{d:.03}", .{ pos.x, pos.y, pos.z }) catch return;
if (ig.checkbox("video fullbright", &self.videoFullbright)) {
if (self.videoplayerObject.fetch(rend.MeshComponent)) |mesh| {
mesh.textureMode.fullbright = self.videoFullbright;
}
}
if (ig.checkbox("move lights ", &self.moveLight)) {}
ig.end(); ig.end();
} }
} }