summaryrefslogtreecommitdiff
path: root/src/gpu/effects/hybrid_3d_effect.cc
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-01 16:18:19 +0100
committerskal <pascal.massimino@gmail.com>2026-02-01 16:18:19 +0100
commit1522b95c838fc3e567066fd96dede3dca25cbc95 (patch)
tree24dd8d2bc586f8b9f8f3518b4fe68907e8eeb1d4 /src/gpu/effects/hybrid_3d_effect.cc
parent1481b0a6313b725eec3e3ebeea085e98703df00f (diff)
feat(gpu): Integrate bumpy 3D renderer into main demo
- Added depth buffer support to MainSequence. - Implemented Hybrid3DEffect for the main timeline. - Fixed effect initialization order in MainSequence. - Ensured depth-stencil compatibility for all scene effects. - Updated demo sequence with 3D elements and post-processing.
Diffstat (limited to 'src/gpu/effects/hybrid_3d_effect.cc')
-rw-r--r--src/gpu/effects/hybrid_3d_effect.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/gpu/effects/hybrid_3d_effect.cc b/src/gpu/effects/hybrid_3d_effect.cc
new file mode 100644
index 0000000..41ede0b
--- /dev/null
+++ b/src/gpu/effects/hybrid_3d_effect.cc
@@ -0,0 +1,80 @@
+// This file is part of the 64k demo project.
+// It implements the Hybrid3DEffect.
+
+#include "gpu/effects/hybrid_3d_effect.h"
+#include "util/asset_manager.h"
+#include "generated/assets.h"
+#include <cmath>
+#include <cassert>
+#include <iostream>
+
+Hybrid3DEffect::Hybrid3DEffect(WGPUDevice device, WGPUQueue queue, WGPUTextureFormat format) : Effect(device, queue), width_(1280), height_(720) {
+ (void)format; // Passed to base, not directly used here.
+}
+
+void Hybrid3DEffect::init(MainSequence* demo) {
+ (void)demo;
+ WGPUTextureFormat format = demo->format; // Get current format from MainSequence (might be different than constructor if resized)
+
+ renderer_.init(device_, queue_, format);
+ renderer_.resize(width_, height_);
+
+ // Texture Manager
+ texture_manager_.init(device_, queue_);
+
+ // Load Noise Asset
+ size_t size = 0;
+ const uint8_t* noise_data = GetAsset(AssetId::ASSET_NOISE_TEX, &size);
+ if (noise_data && size == 256 * 256 * 4) {
+ texture_manager_.create_texture("noise", 256, 256, noise_data);
+ renderer_.set_noise_texture(texture_manager_.get_texture_view("noise"));
+ } else {
+ std::cerr << "Failed to load NOISE_TEX asset." << std::endl;
+ }
+
+ // Setup Scene
+ scene_.clear();
+ Object3D center(ObjectType::BOX); // Use BOX for bumps
+ center.position = vec3(0, 0, 0);
+ center.color = vec4(1, 0, 0, 1);
+ scene_.add_object(center);
+
+ for (int i = 0; i < 8; ++i) {
+ ObjectType type = ObjectType::SPHERE;
+ if (i % 3 == 1) type = ObjectType::TORUS;
+ if (i % 3 == 2) type = ObjectType::BOX;
+
+ Object3D obj(type);
+ float angle = (i / 8.0f) * 6.28318f;
+ obj.position = vec3(std::cos(angle) * 4.0f, 0, std::sin(angle) * 4.0f);
+ obj.scale = vec3(0.5f, 0.5f, 0.5f);
+
+ if (type == ObjectType::SPHERE) obj.color = vec4(0, 1, 0, 1);
+ else if (type == ObjectType::TORUS) obj.color = vec4(0, 0.5, 1, 1);
+ else obj.color = vec4(1, 1, 0, 1);
+
+ scene_.add_object(obj);
+ }
+}
+
+void Hybrid3DEffect::render(WGPURenderPassEncoder pass, float time, float beat, float intensity, float aspect_ratio) {
+ // Animate Objects
+ for (size_t i = 1; i < scene_.objects.size(); ++i) {
+ scene_.objects[i].rotation = quat::from_axis(vec3(0, 1, 0), time * 2.0f + i);
+ scene_.objects[i].position.y = std::sin(time * 3.0f + i) * 1.5f;
+ }
+
+ // Animate Camera
+ float cam_radius = 10.0f + std::sin(time * 0.3f) * 4.0f;
+ float cam_height = 5.0f + std::cos(time * 0.4f) * 3.0f;
+ camera_.set_look_at(
+ vec3(std::sin(time * 0.5f) * cam_radius, cam_height, std::cos(time * 0.5f) * cam_radius),
+ vec3(0, 0, 0),
+ vec3(0, 1, 0)
+ );
+
+ camera_.aspect_ratio = aspect_ratio;
+
+ // Draw
+ renderer_.draw(pass, scene_, camera_, time);
+}