yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
emulator_render_service.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EMU_RENDER_EMULATOR_RENDER_SERVICE_H_
2#define YAZE_APP_EMU_RENDER_EMULATOR_RENDER_SERVICE_H_
3
4#include <memory>
5#include <string>
6#include <vector>
7
8#include "absl/status/status.h"
9#include "absl/status/statusor.h"
11
12namespace yaze {
13
14class Rom;
15namespace zelda3 {
16struct GameData;
17} // namespace zelda3
18
19namespace emu {
20class Snes;
21} // namespace emu
22
23
24namespace emu {
25namespace render {
26
27class SaveStateManager;
28
29// Rendering mode for the service
30enum class RenderMode {
31 kEmulated, // Use SNES emulator with state injection
32 kStatic, // Use ObjectDrawer (fast, reliable)
33 kHybrid, // Use ObjectDrawer for objects, emulator for sprites
34};
35
36// Shared emulator-based rendering service for ALTTP entities.
37//
38// This service provides a unified interface for rendering dungeon objects,
39// sprites, and full rooms using either SNES emulation with save state
40// injection or static rendering via ObjectDrawer.
41//
42// The save state injection approach solves the "cold start" problem where
43// ALTTP's object handlers cannot run in isolation because they expect a
44// fully initialized game context.
45//
46// Usage:
47// EmulatorRenderService service(rom);
48// service.Initialize();
49//
50// RenderRequest req;
51// req.type = RenderTargetType::kDungeonObject;
52// req.entity_id = 0x01; // Wall object
53// req.room_id = 0x12; // Sanctuary
54//
55// auto result = service.Render(req);
56// if (result.ok()) {
57// // Use result->rgba_pixels
58// }
60 public:
61 explicit EmulatorRenderService(Rom* rom, zelda3::GameData* game_data = nullptr);
63
64 // Non-copyable
67
68 // Initialize the service (creates SNES instance, loads baseline states)
69 absl::Status Initialize();
70
71 // Generate baseline save states for different game contexts
72 // This may take several seconds as it boots the game via TAS input
73 absl::Status GenerateBaselineStates();
74
75 // Render a single entity
76 absl::StatusOr<RenderResult> Render(const RenderRequest& request);
77
78 // Render multiple entities (batch operation)
79 absl::StatusOr<std::vector<RenderResult>> RenderBatch(
80 const std::vector<RenderRequest>& requests);
81
82 // Check if service is ready to render
83 bool IsReady() const { return initialized_; }
84
85 // Set the rendering mode
86 void SetRenderMode(RenderMode mode) { render_mode_ = mode; }
88
89 // Access to underlying SNES instance (for advanced use)
90 emu::Snes* snes() { return snes_.get(); }
91
92 // Access to save state manager
94
95 private:
96 // Render implementations for each target type
97 absl::StatusOr<RenderResult> RenderDungeonObject(const RenderRequest& req);
98 absl::StatusOr<RenderResult> RenderDungeonObjectStatic(
99 const RenderRequest& req);
100 absl::StatusOr<RenderResult> RenderSprite(const RenderRequest& req);
101 absl::StatusOr<RenderResult> RenderFullRoom(const RenderRequest& req);
102
103 // State injection helpers
104 void InjectRoomContext(int room_id, uint8_t blockset, uint8_t palette);
105 void LoadPaletteIntoCgram(int palette_id);
106 void LoadGraphicsIntoVram(uint8_t blockset);
108 void ClearTilemapBuffers();
109 void MockApuPorts();
110
111 // Object handler execution
112 absl::StatusOr<int> LookupHandlerAddress(int object_id, int* data_offset);
113 absl::Status ExecuteHandler(int handler_addr, int data_offset,
114 int tilemap_pos);
115
116 // PPU rendering
117 void RenderPpuFrame();
118 std::vector<uint8_t> ExtractPixelsFromPpu();
119
120 Rom* rom_ = nullptr;
122 std::unique_ptr<emu::Snes> snes_;
123 std::unique_ptr<SaveStateManager> state_manager_;
124
126 bool initialized_ = false;
127};
128
129} // namespace render
130} // namespace emu
131} // namespace yaze
132
133#endif // YAZE_APP_EMU_RENDER_EMULATOR_RENDER_SERVICE_H_
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
absl::StatusOr< RenderResult > RenderDungeonObjectStatic(const RenderRequest &req)
absl::Status ExecuteHandler(int handler_addr, int data_offset, int tilemap_pos)
absl::StatusOr< RenderResult > Render(const RenderRequest &request)
void InjectRoomContext(int room_id, uint8_t blockset, uint8_t palette)
absl::StatusOr< RenderResult > RenderDungeonObject(const RenderRequest &req)
absl::StatusOr< RenderResult > RenderFullRoom(const RenderRequest &req)
absl::StatusOr< std::vector< RenderResult > > RenderBatch(const std::vector< RenderRequest > &requests)
absl::StatusOr< RenderResult > RenderSprite(const RenderRequest &req)
std::unique_ptr< SaveStateManager > state_manager_
EmulatorRenderService & operator=(const EmulatorRenderService &)=delete
EmulatorRenderService(const EmulatorRenderService &)=delete
absl::StatusOr< int > LookupHandlerAddress(int object_id, int *data_offset)
EmulatorRenderService(Rom *rom, zelda3::GameData *game_data=nullptr)