GroveEngine/modules/BgfxRenderer/Frame/FramePacket.h
StillHammer 0540fbf526 fix: Resolve bgfx Frame 1 crash on Windows DLL + MinGW GCC 15 compatibility
- Add BGFX_CONFIG_MULTITHREADED=0 to fix TLS crash when bgfx runs from DLL
- Add -include stdint.h for MinGW GCC 15+ compatibility with bgfx third-party code
- Guard SDL2-dependent visual tests with if(SDL2_FOUND)
- Clean up debug logging in BgfxDevice::frame() and BgfxRendererModule::process()
- Re-enable all modules in test_full_stack_interactive.cpp
- Add grove::fs namespace for cross-platform filesystem operations
- Add InputModule C export for feedEvent across DLL boundary

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:03:06 +07:00

144 lines
4.3 KiB
C++

#pragma once
#include <cstdint>
#include <cstddef>
namespace grove {
class FrameAllocator;
// ============================================================================
// Sprite Instance Data
// ============================================================================
// GPU Instance data - must match shader layout (5 x vec4 = 80 bytes)
// i_data0: x, y, scaleX, scaleY
// i_data1: rotation, u0, v0, u1
// i_data2: v1, textureId (as float), layer (as float), padding
// i_data3: reserved
// i_data4: r, g, b, a (color as floats 0-1)
struct SpriteInstance {
// i_data0
float x, y; // Position
float scaleX, scaleY; // Scale
// i_data1
float rotation; // Radians
float u0, v0, u1; // UV start + end x
// i_data2
float v1; // UV end y
float textureId; // As float for GPU compatibility
float layer; // Z-order as float
float padding0;
// i_data3
float reserved[4]; // Reserved for future use
// i_data4
float r, g, b, a; // Color as floats (0-1)
};
static_assert(sizeof(SpriteInstance) == 80, "SpriteInstance must be 80 bytes for GPU instancing");
// ============================================================================
// Tilemap Chunk Data
// ============================================================================
struct TilemapChunk {
float x, y; // Chunk position
uint16_t width, height;
uint16_t tileWidth, tileHeight;
uint16_t textureId;
const uint16_t* tiles; // Tile indices in tileset
size_t tileCount;
};
// ============================================================================
// Text Command Data
// ============================================================================
struct TextCommand {
float x, y;
const char* text; // Null-terminated, allocated in FrameAllocator
uint16_t fontId;
uint16_t fontSize;
uint32_t color;
uint16_t layer;
};
// ============================================================================
// Particle Instance Data
// ============================================================================
struct ParticleInstance {
float x, y;
float vx, vy;
float size;
float life; // 0-1, remaining time
uint32_t color;
uint16_t textureId;
};
// ============================================================================
// Debug Shape Data
// ============================================================================
struct DebugLine {
float x1, y1, x2, y2;
uint32_t color;
};
struct DebugRect {
float x, y, w, h;
uint32_t color;
bool filled;
};
// ============================================================================
// Camera/View Info
// ============================================================================
struct ViewInfo {
float viewMatrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; // Identity matrix
float projMatrix[16] = {1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1}; // Identity matrix
float positionX = 0.0f, positionY = 0.0f;
float zoom = 1.0f;
uint16_t viewportX = 0, viewportY = 0;
uint16_t viewportW = 1280, viewportH = 720;
};
// ============================================================================
// Frame Packet - IMMUTABLE after construction
// ============================================================================
struct FramePacket {
uint64_t frameNumber = 0;
float deltaTime = 0.016f;
// Collected data (read-only for passes)
const SpriteInstance* sprites = nullptr;
size_t spriteCount = 0;
const TilemapChunk* tilemaps = nullptr;
size_t tilemapCount = 0;
const TextCommand* texts = nullptr;
size_t textCount = 0;
const ParticleInstance* particles = nullptr;
size_t particleCount = 0;
const DebugLine* debugLines = nullptr;
size_t debugLineCount = 0;
const DebugRect* debugRects = nullptr;
size_t debugRectCount = 0;
// Main view (initialized to identity transforms)
ViewInfo mainView = {};
// Clear color (default dark gray)
uint32_t clearColor = 0x303030FF;
// Allocator for temporary pass data
FrameAllocator* allocator = nullptr;
};
} // namespace grove