Blackout3D
Blackout3D is a minimal 3D application template that serves as the perfect starting point for developing custom LED cube applications. It demonstrates the essential structure and methods required for 3D cube rendering.
Overview
Blackout3D provides a clean, minimal template that:
Inherits from
CubeApplication
for 3D volumetric renderingImplements the basic application loop pattern
Connects to matrixserver at 20 FPS for minimal load
Serves as a foundation for custom 3D applications
This application is ideal for:
Learning the basic cube application structure
Starting new 3D application development
Testing basic connectivity and rendering setup
Understanding the minimal requirements for cube applications
Implementation
Core Structure
// Blackout3D.h
#include "CubeApplication.h"
class Blackout3D : public CubeApplication {
public:
Blackout3D();
virtual bool loop() override;
};
Application Loop
The implementation demonstrates the minimal application loop:
// Blackout3D.cpp
#include "Blackout3D.h"
Blackout3D::Blackout3D() : CubeApplication(20, "cube10.local") {
// Constructor: 20 FPS, connect to specific host
// Add initialization code here
}
bool Blackout3D::loop() {
clear(); // Clear all voxels from previous frame
// Add your custom 3D rendering logic here:
// setPixel3D(Vector3i(x, y, z), Color::red());
// drawLine3D(start, end, Color::blue());
// drawText(front, pos, Color::white(), "Hello");
render(); // Send frame to server
return true; // Continue running (false to exit)
}
Configuration
Frame Rate
Blackout3D runs at 20 FPS to minimize system load while providing a responsive development environment:
Blackout3D() : CubeApplication(20, "cube10.local")
Connection
By default connects to cube10.local
. Modify the host parameter to connect to different server instances:
// Local development
Blackout3D() : CubeApplication(20, "localhost")
// Specific IP address
Blackout3D() : CubeApplication(20, "192.168.1.100")
Development Guide
Starting a New Application
Copy the Blackout3D files as a template:
cp -r Blackout3D/ MyNewApp/ # Rename files and classes appropriately
Modify the constructor for your needs:
MyNewApp() : CubeApplication(30, "localhost") { // Initialize your application state initializeGameObjects(); loadResources(); }
Implement your rendering logic in the loop method:
bool MyNewApp::loop() { clear(); // Update application state updatePhysics(); handleInput(); // Render 3D content drawGameObjects(); drawUI(); render(); return true; }
Common Extensions
Adding Joystick Input:
class MyNewApp : public CubeApplication {
private:
std::vector<Joystick*> joysticks;
public:
MyNewApp() : CubeApplication(30, "localhost") {
joysticks.push_back(new Joystick(0)); // Player 1
}
bool loop() override {
clear();
// Handle input
for(auto joystick : joysticks) {
if(joystick->getButtonPress(0)) {
// Handle button press
}
joystick->clearAllButtonPresses();
}
render();
return true;
}
};
Adding 3D Objects:
bool loop() override {
clear();
// Draw a 3D line
drawLine3D(Vector3i(0, 0, 0), Vector3i(63, 63, 63), Color::red());
// Set individual voxels
setPixel3D(Vector3i(32, 32, 32), Color::blue());
// Draw text on cube faces
drawText(ScreenNumber::front, Vector2i(10, 10),
Color::white(), "Hello Cube!");
render();
return true;
}
Adding Animation:
bool loop() override {
static int counter = 0;
static float time = 0.0f;
clear();
// Animated rotation
time += 0.1f;
int x = 32 + 20 * cos(time);
int y = 32 + 20 * sin(time);
int z = 32;
setPixel3D(Vector3i(x, y, z), Color::red());
render();
counter++;
return true;
}
Building and Running
Build Process
# Build Blackout3D specifically
mkdir -p build && cd build
cmake .. && make blackout3d
# Run the application
./blackout3d
Prerequisites
MatrixServer Running: Start appropriate server before launching:
# For development /path/to/matrixserver/build/server_simulator # For hardware /path/to/matrixserver/build/server_FPGA
Dependencies Installed: Ensure matrixapplication library is available
Troubleshooting
Connection Issues
Server not running: Start matrixserver before launching application
Wrong host: Verify the hostname/IP in the constructor
Port conflicts: Check that port 2017 is available
Performance Issues
High CPU usage: Blackout3D runs at low 20 FPS by design
Slow rendering: Check server implementation performance
Memory leaks: Ensure proper cleanup in destructor if adding dynamic objects
Next Steps
After mastering Blackout3D, explore more complex applications:
CubeTestApp - See comprehensive 3D rendering examples
Snake - Learn game state management and input handling
Breakout3D - Study physics and collision detection
PixelFlow3 - Examine particle system implementation
The minimal nature of Blackout3D makes it the ideal foundation for understanding cube application development and serves as a clean starting point for any custom 3D LED cube project.