- system.py runs app.Loop() on the script fiber; each UIUpdate is one CPythonApplication::Process(). Logo -> Login, popup ESC/click and app.Exit teardown (launcher cleared first, as in 40250 Main) work. - Image commands are base-texture quads with UVs (a .sub shares its parent texture); ImageInstance/ExpandedImageInstance OnRender and SetRenderingRect ported verbatim, so scale/rotation/rendering rect are drawn. - CGraphicBase::GetColor / grp.GenerateColor ported (ThinBoard background). - port.app_loop test, python_host_test app-loop checks, MT_TEST_MODE=python_ui. - TODO: .fnt/CGraphicText font pipeline, ExpandedImage blend modes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
48 lines
2.0 KiB
C++
48 lines
2.0 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
// Commands emitted by the 40250 UI drawing calls, consumed by Godot's CanvasItem.
|
|
// The port layer stays independent of godot-cpp.
|
|
struct UIRenderCommand {
|
|
enum Kind { Bar, Line, Text, Image } kind;
|
|
float x1, y1, x2, y2;
|
|
std::uint32_t argb;
|
|
float clip_x1 = 0, clip_y1 = 0, clip_x2 = 0, clip_y2 = 0;
|
|
std::string text;
|
|
// Image only: text is the texture's file, drawn as the quad (vertices 0..3 = TL, TR, BL, BR)
|
|
// with texture coordinates su,sv..eu,ev; x1..y2 is the quad's bounding box.
|
|
bool quad = false;
|
|
float qx[4] = {}, qy[4] = {};
|
|
float su = 0, sv = 0, eu = 1, ev = 1;
|
|
int blend = 0; // CGraphicExpandedImageInstance::RENDERING_MODE_*
|
|
};
|
|
|
|
// D3DXCOLOR (0..1 floats) -> the 0xAARRGGBB the commands carry.
|
|
template <class Color>
|
|
std::uint32_t UIRenderColor(const Color& color) {
|
|
auto channel = [](float value) -> std::uint32_t {
|
|
return static_cast<std::uint32_t>((value < 0 ? 0 : value > 1 ? 1 : value) * 255.0f + 0.5f);
|
|
};
|
|
return (channel(color.a) << 24) | (channel(color.r) << 16) | (channel(color.g) << 8) | channel(color.b);
|
|
}
|
|
|
|
class CGraphicTexture;
|
|
std::string UIRenderTextureName(const CGraphicTexture* texture);
|
|
|
|
// A textured quad from 40250's TPDTVertex[4] (TL, TR, BL, BR) positions and texture coordinates.
|
|
// PORT: D3D8 puts pixel centres on integers, which is why 40250 subtracts 0.5 from every vertex; the
|
|
// Godot canvas puts them on .5, so the quad is shifted back by +0.5 here.
|
|
void UIRenderAddImage(const CGraphicTexture* texture, const float x[4], const float y[4],
|
|
float su, float sv, float eu, float ev, std::uint32_t argb, int blend = 0);
|
|
|
|
void UIRenderSetSize(int width, int height);
|
|
void UIRenderGetSize(unsigned* width, unsigned* height);
|
|
void UIRenderBeginFrame();
|
|
void UIRenderAdd(UIRenderCommand command);
|
|
const std::vector<UIRenderCommand>& UIRenderCommands();
|
|
void UIRenderSetClip(float x, float y, float width, float height);
|
|
void UIRenderRestoreClip();
|