to hell with bloom, too complicated.
This commit is contained in:
parent
74c38c8af8
commit
c4c28f3b7a
@ -19,10 +19,6 @@ pub fn build(b: *std.Build) !void {
|
|||||||
.source_file = .{ .path = "libs/zgltf/src/main.zig" },
|
.source_file = .{ .path = "libs/zgltf/src/main.zig" },
|
||||||
}));
|
}));
|
||||||
|
|
||||||
exe.addAnonymousModule("opengl", .{
|
|
||||||
.source_file = .{ .path = "libs/gl3v3.zig" }
|
|
||||||
});
|
|
||||||
|
|
||||||
// Provide filenames of all files in 'src/ROMs' to program as options
|
// Provide filenames of all files in 'src/ROMs' to program as options
|
||||||
{
|
{
|
||||||
var files = std.ArrayList([]const u8).init(b.allocator);
|
var files = std.ArrayList([]const u8).init(b.allocator);
|
||||||
@ -41,7 +37,7 @@ pub fn build(b: *std.Build) !void {
|
|||||||
exe.addOptions("options", options);
|
exe.addOptions("options", options);
|
||||||
}
|
}
|
||||||
|
|
||||||
raylib.addTo(b, exe, target, optimize);
|
raylib.addTo(b, exe, target, optimize, .{});
|
||||||
|
|
||||||
{
|
{
|
||||||
var build_models_step = b.step("models", "Export .blend files");
|
var build_models_step = b.step("models", "Export .blend files");
|
||||||
|
5041
libs/gl3v3.zig
5041
libs/gl3v3.zig
File diff suppressed because it is too large
Load Diff
@ -14,7 +14,7 @@ const assert = std.debug.assert;
|
|||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const StringList = std.ArrayList([]const u8);
|
const StringList = std.ArrayList([]const u8);
|
||||||
|
|
||||||
const max_lights: u32 = 3;
|
const max_lights: u32 = 2;
|
||||||
|
|
||||||
allocator: Allocator,
|
allocator: Allocator,
|
||||||
|
|
||||||
@ -33,6 +33,7 @@ raylib_chip: *RaylibChip,
|
|||||||
chip_sound: rl.Sound,
|
chip_sound: rl.Sound,
|
||||||
screen_texture: rl.RenderTexture2D,
|
screen_texture: rl.RenderTexture2D,
|
||||||
rom: ?ROM = null,
|
rom: ?ROM = null,
|
||||||
|
camera: rl.Camera3D,
|
||||||
|
|
||||||
pub fn genSinWave(wave: *rl.Wave, frequency: f32) void {
|
pub fn genSinWave(wave: *rl.Wave, frequency: f32) void {
|
||||||
assert(wave.sampleSize == 16); // Only 16 bits are supported
|
assert(wave.sampleSize == 16); // Only 16 bits are supported
|
||||||
@ -157,8 +158,6 @@ pub fn init(allocator: Allocator) !Self {
|
|||||||
errdefer emulator.deinit();
|
errdefer emulator.deinit();
|
||||||
emulator.setShader(shader);
|
emulator.setShader(shader);
|
||||||
|
|
||||||
lights[2].set_point(rl.GREEN, emulator.get_power_light_position(), 0.3);
|
|
||||||
|
|
||||||
return Self {
|
return Self {
|
||||||
.allocator = allocator,
|
.allocator = allocator,
|
||||||
.emulator = emulator,
|
.emulator = emulator,
|
||||||
@ -169,7 +168,14 @@ pub fn init(allocator: Allocator) !Self {
|
|||||||
.raylib_chip = raylib_chip,
|
.raylib_chip = raylib_chip,
|
||||||
.chip_sound = chip_sound,
|
.chip_sound = chip_sound,
|
||||||
.screen_texture = screen_texture,
|
.screen_texture = screen_texture,
|
||||||
.powered = powered
|
.powered = powered,
|
||||||
|
.camera = rl.Camera3D{
|
||||||
|
.position = rl.Vector3.new(0, 0, -10),
|
||||||
|
.target = rl.Vector3.new(0.0, 0.0, 0.0),
|
||||||
|
.up = rl.Vector3.new(0.0, 1.0, 0.0),
|
||||||
|
.fovy = 45.0,
|
||||||
|
.projection = rl.CameraProjection.CAMERA_PERSPECTIVE,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +219,7 @@ pub fn toggle_power(self: *Self) void {
|
|||||||
|
|
||||||
fn updateCamera(self: *Self, dt: f32) void {
|
fn updateCamera(self: *Self, dt: f32) void {
|
||||||
const mouse_delta = rl.GetMouseDelta();
|
const mouse_delta = rl.GetMouseDelta();
|
||||||
const camera = &self.ctx.camera;
|
const camera = &self.camera;
|
||||||
const emulator = &self.emulator;
|
const emulator = &self.emulator;
|
||||||
|
|
||||||
if (rl.IsWindowResized()) {
|
if (rl.IsWindowResized()) {
|
||||||
@ -288,11 +294,11 @@ fn updateCamera(self: *Self, dt: f32) void {
|
|||||||
pub fn update(self: *Self, dt: f32) void {
|
pub fn update(self: *Self, dt: f32) void {
|
||||||
self.updateCamera(dt);
|
self.updateCamera(dt);
|
||||||
|
|
||||||
const camera = &self.ctx.camera;
|
const camera = &self.camera;
|
||||||
const cameraPos = [3]f32{ camera.position.x, camera.position.y, camera.position.z };
|
const cameraPos = [3]f32{ camera.position.x, camera.position.y, camera.position.z };
|
||||||
rl.SetShaderValue(self.shader, self.shader.locs.?[@intFromEnum(rl.ShaderLocationIndex.SHADER_LOC_VECTOR_VIEW)], &cameraPos, .SHADER_UNIFORM_VEC3);
|
rl.SetShaderValue(self.shader, self.shader.locs.?[@intFromEnum(rl.ShaderLocationIndex.SHADER_LOC_VECTOR_VIEW)], &cameraPos, .SHADER_UNIFORM_VEC3);
|
||||||
|
|
||||||
const ray = rl.GetMouseRay(rl.GetMousePosition(), self.ctx.camera);
|
const ray = rl.GetMouseRay(rl.GetMousePosition(), self.camera);
|
||||||
if (self.emulator.isOverPowerSwitch(ray)) {
|
if (self.emulator.isOverPowerSwitch(ray)) {
|
||||||
if (rl.IsMouseButtonPressed(rl.MouseButton.MOUSE_BUTTON_LEFT)) {
|
if (rl.IsMouseButtonPressed(rl.MouseButton.MOUSE_BUTTON_LEFT)) {
|
||||||
self.toggle_power();
|
self.toggle_power();
|
||||||
@ -304,8 +310,6 @@ pub fn update(self: *Self, dt: f32) void {
|
|||||||
self.raylib_chip.update(dt);
|
self.raylib_chip.update(dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.lights[2].set_enabled(self.powered.*);
|
|
||||||
|
|
||||||
rl.BeginTextureMode(self.screen_texture);
|
rl.BeginTextureMode(self.screen_texture);
|
||||||
{
|
{
|
||||||
self.raylib_chip.render();
|
self.raylib_chip.render();
|
||||||
@ -362,18 +366,13 @@ pub fn update(self: *Self, dt: f32) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw(self: *Self) void {
|
pub fn draw(self: *Self) void {
|
||||||
const emissiveLoc = rl.GetShaderLocation(self.shader, "emissive");
|
rl.ClearBackground(rl.Color{ .r = 33, .g = 33, .b = 33 });
|
||||||
const enabled = true;
|
|
||||||
const disabled = false;
|
|
||||||
rl.BeginShaderMode(self.shader);
|
rl.BeginShaderMode(self.shader);
|
||||||
{
|
{
|
||||||
|
rl.BeginMode3D(self.camera);
|
||||||
self.emulator.draw();
|
self.emulator.draw();
|
||||||
|
rl.EndMode3D();
|
||||||
rl.SetShaderValue(self.shader, emissiveLoc, &enabled, .SHADER_UNIFORM_INT);
|
|
||||||
rl.DrawSphere(self.emulator.power_light_position, 0.015, rl.RED);
|
|
||||||
rl.rlDrawRenderBatchActive();
|
|
||||||
rl.SetShaderValue(self.shader, emissiveLoc, &disabled, .SHADER_UNIFORM_INT);
|
|
||||||
}
|
}
|
||||||
rl.EndShaderMode();
|
rl.EndShaderMode();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
11
src/main.zig
11
src/main.zig
@ -8,8 +8,6 @@ const RaylibChip = @import("raylib-chip.zig");
|
|||||||
const MainScene = @import("./main-scene.zig");
|
const MainScene = @import("./main-scene.zig");
|
||||||
const listROMs = @import("./roms.zig").listROMs;
|
const listROMs = @import("./roms.zig").listROMs;
|
||||||
|
|
||||||
const TestScene = @import("test-scene.zig");
|
|
||||||
|
|
||||||
fn megabytes(amount: usize) usize {
|
fn megabytes(amount: usize) usize {
|
||||||
return amount * 1024 * 1024;
|
return amount * 1024 * 1024;
|
||||||
}
|
}
|
||||||
@ -30,11 +28,11 @@ pub fn main() anyerror!void {
|
|||||||
|
|
||||||
rl.SetTargetFPS(60);
|
rl.SetTargetFPS(60);
|
||||||
|
|
||||||
var scene = try TestScene.init(allocator);
|
var scene = try MainScene.init(allocator);
|
||||||
defer scene.deinit();
|
defer scene.deinit();
|
||||||
|
|
||||||
// const roms = comptime listROMs();
|
const roms = comptime listROMs();
|
||||||
// scene.set_rom(roms[3]);
|
scene.set_rom(roms[3]);
|
||||||
|
|
||||||
const font_size = 24;
|
const font_size = 24;
|
||||||
const font_ttf_default_numchars = 95; // TTF font generation default charset: 95 glyphs (ASCII 32..126)
|
const font_ttf_default_numchars = 95; // TTF font generation default charset: 95 glyphs (ASCII 32..126)
|
||||||
@ -44,6 +42,9 @@ pub fn main() anyerror!void {
|
|||||||
while (!rl.WindowShouldClose()) {
|
while (!rl.WindowShouldClose()) {
|
||||||
var dt = rl.GetFrameTime();
|
var dt = rl.GetFrameTime();
|
||||||
scene.update(dt);
|
scene.update(dt);
|
||||||
|
|
||||||
|
rl.BeginDrawing();
|
||||||
scene.draw();
|
scene.draw();
|
||||||
|
rl.EndDrawing();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ pub fn render(self: *const Self) void {
|
|||||||
for (0..self.chip.display_height) |y| {
|
for (0..self.chip.display_height) |y| {
|
||||||
for (0..self.chip.display_width) |x| {
|
for (0..self.chip.display_width) |x| {
|
||||||
if (self.chip.display_get(@intCast(x), @intCast(y))) {
|
if (self.chip.display_get(@intCast(x), @intCast(y))) {
|
||||||
rl.DrawPixel(@intCast(x), @intCast(y), self.on_color);
|
rl.DrawRectangle(@intCast(x), @intCast(y), 1, 1, self.on_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,39 +0,0 @@
|
|||||||
#version 330
|
|
||||||
|
|
||||||
// Input vertex attributes (from vertex shader)
|
|
||||||
in vec2 fragTexCoord;
|
|
||||||
in vec4 fragColor;
|
|
||||||
|
|
||||||
// Input uniform values
|
|
||||||
uniform sampler2D texture0;
|
|
||||||
uniform vec4 colDiffuse;
|
|
||||||
|
|
||||||
// Output fragment color
|
|
||||||
out vec4 finalColor;
|
|
||||||
|
|
||||||
uniform vec2 renderSize;
|
|
||||||
// const vec2 size = vec2(800, 450); // Framebuffer size
|
|
||||||
const float samples = 7.0; // Pixels per axis; higher = bigger glow, worse performance
|
|
||||||
const float quality = 5.0; // Defines size factor: Lower = smaller glow, better quality
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
vec4 sum = vec4(0);
|
|
||||||
vec2 sizeFactor = vec2(1)/renderSize*quality;
|
|
||||||
|
|
||||||
// Texel color fetching from texture sampler
|
|
||||||
vec4 source = texture(texture0, fragTexCoord);
|
|
||||||
|
|
||||||
const int range = (int(samples) - 1)/2; // should be = (samples - 1)/2;
|
|
||||||
|
|
||||||
for (int x = -range; x <= range; x++)
|
|
||||||
{
|
|
||||||
for (int y = -range; y <= range; y++)
|
|
||||||
{
|
|
||||||
sum += texture(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate final fragment color
|
|
||||||
finalColor = ((sum/(samples*samples)) + source)*colDiffuse;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
#version 330
|
|
||||||
|
|
||||||
// Input vertex attributes
|
|
||||||
in vec3 vertexPosition;
|
|
||||||
in vec2 vertexTexCoord;
|
|
||||||
in vec3 vertexNormal;
|
|
||||||
in vec4 vertexColor;
|
|
||||||
|
|
||||||
// Input uniform values
|
|
||||||
uniform mat4 mvp;
|
|
||||||
|
|
||||||
// Output vertex attributes (to fragment shader)
|
|
||||||
out vec2 fragTexCoord;
|
|
||||||
out vec4 fragColor;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
// Send vertex attributes to fragment shader
|
|
||||||
fragTexCoord = vertexTexCoord;
|
|
||||||
fragColor = vertexColor;
|
|
||||||
|
|
||||||
// Calculate final vertex position
|
|
||||||
gl_Position = mvp*vec4(vertexPosition, 1.0);
|
|
||||||
}
|
|
@ -1,116 +0,0 @@
|
|||||||
const Self = @This();
|
|
||||||
|
|
||||||
const rl = @import("raylib");
|
|
||||||
const gl = @import("opengl");
|
|
||||||
const std = @import("std");
|
|
||||||
const Allocator = std.mem.Allocator;
|
|
||||||
const ShaderCode = @import("./shader-code.zig");
|
|
||||||
const Light = @import("./light.zig");
|
|
||||||
|
|
||||||
const max_lights = 1;
|
|
||||||
|
|
||||||
const SHADER_LOC_VECTOR_VIEW = @intFromEnum(rl.ShaderLocationIndex.SHADER_LOC_VECTOR_VIEW);
|
|
||||||
|
|
||||||
shader: rl.Shader,
|
|
||||||
bloom_shader: rl.Shader,
|
|
||||||
frame_buffer: rl.RenderTexture2D,
|
|
||||||
camera: rl.Camera3D,
|
|
||||||
lights: [max_lights]Light,
|
|
||||||
|
|
||||||
cube: rl.Model,
|
|
||||||
|
|
||||||
pub fn init(allocator: Allocator) !Self {
|
|
||||||
const main_shader_code = try ShaderCode.init(allocator, max_lights);
|
|
||||||
defer main_shader_code.deinit();
|
|
||||||
const shader = rl.LoadShaderFromMemory(main_shader_code.vertex, main_shader_code.fragment);
|
|
||||||
errdefer rl.UnloadShader(shader);
|
|
||||||
|
|
||||||
if (shader.id == rl.rlGetShaderIdDefault()) {
|
|
||||||
return error.CompileShader;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bloom_shader = rl.LoadShaderFromMemory(@embedFile("shaders/default_vs.glsl"), @embedFile("shaders/bloom_fs.glsl"));
|
|
||||||
errdefer rl.UnloadShader(bloom_shader);
|
|
||||||
if (bloom_shader.id == rl.rlGetShaderIdDefault()) {
|
|
||||||
return error.CompileShader;
|
|
||||||
}
|
|
||||||
|
|
||||||
const frame_buffer = rl.LoadRenderTexture(rl.GetScreenWidth(), rl.GetScreenHeight());
|
|
||||||
errdefer rl.UnloadRenderTexture(frame_buffer);
|
|
||||||
|
|
||||||
var lights: [max_lights]Light = undefined;
|
|
||||||
for (0..max_lights) |i| {
|
|
||||||
lights[i] = Light.init(shader, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
Light.init(shader, 0).set_point(rl.RED, rl.Vector3{ .x = 1, .y = 1, .z = 0.5 }, 2.0);
|
|
||||||
|
|
||||||
shader.locs.?[SHADER_LOC_VECTOR_VIEW] = rl.GetShaderLocation(shader, "viewPos");
|
|
||||||
|
|
||||||
const ambientLoc = rl.GetShaderLocation(shader, "ambient");
|
|
||||||
rl.SetShaderValue(shader, ambientLoc, &[4]f32{ 0.6, 0.6, 1, 1.0 }, .SHADER_UNIFORM_VEC4);
|
|
||||||
|
|
||||||
return Self{
|
|
||||||
.shader = shader,
|
|
||||||
.bloom_shader = bloom_shader,
|
|
||||||
.frame_buffer = frame_buffer,
|
|
||||||
.camera = rl.Camera3D{
|
|
||||||
.position = rl.Vector3.new(0, 0, -10),
|
|
||||||
.target = rl.Vector3.new(0.0, 0.0, 0.0),
|
|
||||||
.up = rl.Vector3.new(0.0, 1.0, 0.0),
|
|
||||||
.fovy = 45.0,
|
|
||||||
.projection = rl.CameraProjection.CAMERA_PERSPECTIVE,
|
|
||||||
},
|
|
||||||
.lights = lights,
|
|
||||||
.cube = rl.LoadModelFromMesh(rl.GenMeshCube(1.0, 1.0, 1.0))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn deinit(self: Self) void {
|
|
||||||
rl.UnloadShader(self.shader);
|
|
||||||
rl.UnloadRenderTexture(self.frame_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update(self: *Self, dt: f32) void {
|
|
||||||
const screen_width = rl.GetScreenWidth();
|
|
||||||
const screen_height = rl.GetScreenHeight();
|
|
||||||
if (self.frame_buffer.texture.width != screen_width or self.frame_buffer.texture.height != screen_height) {
|
|
||||||
rl.UnloadRenderTexture(self.frame_buffer);
|
|
||||||
self.frame_buffer = rl.LoadRenderTexture(screen_width, screen_height);
|
|
||||||
}
|
|
||||||
|
|
||||||
rl.UpdateCamera(&self.camera, .CAMERA_THIRD_PERSON);
|
|
||||||
|
|
||||||
const cameraPos = [3]f32{ self.camera.position.x, self.camera.position.y, self.camera.position.z };
|
|
||||||
rl.SetShaderValue(self.shader, self.shader.locs.?[SHADER_LOC_VECTOR_VIEW], @ptrCast(&cameraPos), .SHADER_UNIFORM_VEC3);
|
|
||||||
_ = dt;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn draw(self: *Self) void {
|
|
||||||
rl.BeginTextureMode(self.frame_buffer);
|
|
||||||
{
|
|
||||||
rl.ClearBackground(.{ .r = 33, .g = 33, .b = 33, .a = 255 });
|
|
||||||
|
|
||||||
rl.BeginMode3D(self.camera);
|
|
||||||
rl.BeginShaderMode(self.shader);
|
|
||||||
|
|
||||||
self.cube.materials.?[0].shader = self.shader;
|
|
||||||
rl.DrawModel(self.cube, rl.Vector3Zero(), 1.0, rl.WHITE);
|
|
||||||
|
|
||||||
rl.EndShaderMode();
|
|
||||||
rl.EndMode3D();
|
|
||||||
}
|
|
||||||
rl.EndTextureMode();
|
|
||||||
|
|
||||||
const screen_width = rl.GetScreenWidth();
|
|
||||||
const screen_height = rl.GetScreenHeight();
|
|
||||||
const screen_rect = rl.Rectangle{ .x = 0, .y = 0, .width = @floatFromInt(screen_width), .height = @floatFromInt(screen_height) };
|
|
||||||
|
|
||||||
const loc = rl.GetShaderLocation(self.bloom_shader, "renderSize");
|
|
||||||
rl.SetShaderValue(self.bloom_shader, loc, &[2]f32{ @floatFromInt(screen_width), @floatFromInt(screen_height) }, .SHADER_UNIFORM_VEC2);
|
|
||||||
rl.BeginDrawing();
|
|
||||||
rl.BeginShaderMode(self.bloom_shader);
|
|
||||||
rl.DrawTextureRec(self.frame_buffer.texture, screen_rect, rl.Vector2.zero(), rl.WHITE);
|
|
||||||
rl.EndShaderMode();
|
|
||||||
rl.EndDrawing();
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user