Surfaces
Vytvořte displej ve 3D světě a zobrazujte na něm vlastní text, obrázky nebo rozhraní.
Co jsou Render Surfaces?#
Render Surface je obdélníková zobrazovací plocha připojená k fyzikálnímu tělesu. V GameMakeru na ni kreslíte běžný 2D obsah a BBMOD jej zobrazí ve 3D scéně. Hodí se například pro obrazovku přístroje, palubní displej nebo informační panel.
V Blenderu určíte umístění a velikost plochy. V GameMakeru nastavíte, co se na ní zobrazí. Plocha při pohybu a otáčení následuje své těleso.
Vytvoření v Blenderu#
Vyberte JoltPhysics Root a přidejte Render Surface z nabídky Add → JoltPhysics → Helpers. Nastavte mu Key, například dashboard_display; stejný klíč použijete k vyhledání plochy v GameMakeru.

Pozice a rozměry#
Vyberte Render Surface a otevřete jeho nastavení. Key je identifikátor používaný v kódu; Display Name je popisný název. Pro následující ukázku nastavte Key na dashboard_display. Pomocí Position a Rotation určete umístění a natočení plochy.
Plochu posuňte a natočte podle svého objektu. Celou šířku a výšku v metrech nastavujte pomocí Width a Height, nikoli změnou Scale objektu.

Obdélník je vystředěný kolem svého počátku a leží v lokální rovině XY. Přední strana míří ve směru lokální +Z a horní okraj ve směru +Y. Pomocí vodicích šipek natočte přední stranu k pozorovateli; plocha je jednostranná.
Spusťte Validate a exportujte konfiguraci jako Jolt JSON. Pokud ze stejného assetu budete vytvářet i vlastnící těleso, přidejte také kolizní tvary: samotná Render Surface kolizní těleso nedefinuje.
Použití v GameMakeru#
Nejprve načtěte exportovaný asset a vytvořte jeho těleso podle návodu Začínáme. Následující ukázka předpokládá, že asset obsahuje načtená data, body je platné fyzikální těleso našeho systému a BBMOD renderer je již připravený. Pokud se objekt rendereru ve vašem projektu jmenuje jinak, nahraďte o_control_bbmod_renderer jeho názvem.
V události Create vlastnícího objektu, až budou tyto prostředky připravené, vytvořte a zaregistrujte displej:
display = jolt_asset_create_surface(asset, "dashboard_display", body);
if (is_undefined(display)) {
show_debug_message(jolt_get_error().message);
} else {
display.set_resolution(512, 256);
display.set_update_rate(30);
display.set_renderer(o_control_bbmod_renderer.renderer);
}Vykreslení vlastního obsahu#
Tento kód vložte do Draw Begin tak, aby se provedl před vykreslením scény přes BBMOD. Vykreslí tmavé pozadí a text Ready. Souřadnice se zadávají v pixelech textury od levého horního rohu.
if (!is_undefined(display) && display.draw_begin()) {
try {
draw_clear(c_black);
draw_set_color(c_white);
draw_text(20, 20, "Ready");
} finally {
display.draw_end();
}
}Kreslete pouze tehdy, když draw_begin() vrátí true, a každé úspěšné volání zakončete draw_end(). Hodnota false může pouze znamenat, že ještě není čas obsah obnovit. Uvnitř bloku neměňte vykreslovací cíl ani nastavení displeje.
Nastavení zobrazení#
| Nastavení | Co mění |
|---|---|
| display.set_resolution(512, 256) | Rozlišení obsahu v pixelech. Vyšší hodnoty umožní více detailů, ale spotřebují více paměti. Nemění rozměry plochy ve světě; zachovejte odpovídající poměr stran. |
| display.set_update_rate(30) | Obnovuje obsah nejvýše 30krát za sekundu při běžném běhu. Hodnota 0 znamená každý vykreslený snímek. Pohyb plochy s tělesem tím nezpomalíte. |
| display.set_visible(false) | Dočasně skryje displej. Hodnota true jej opět zobrazí. |
| display.set_size(1, 0.5) | Změní šířku a výšku plochy v metrech, nikoli rozlišení textury. |
Úklid#
V Clean Up uvolněte displej před zrušením jeho tělesa nebo ukončením fyzikálního světa:
if (!is_undefined(display)) {
display.destroy();
display = undefined;
}Technické poznámky#
Render Surfaces používají záznamy surfaces[] v JSON v4. Blender ukládá umístění a rozměry; obsah pixelů, rozlišení a kreslicí callbacky se nastavují za běhu hry. Současný displej je neprůhledný, takže průhledné pixely nevytvoří otvory.
Rozlišení přijímá celá čísla 1–2048 pixelů pro každou stranu; frekvence obnovy přijímá 0–1000 Hz. Ztracená textura nebo změna jejího rozlišení vyžaduje nové vykreslení při příštím úspěšném draw_begin(). Alternativou je automatické kreslení přes set_draw_callback(); úspěšné ruční kreslení tento callback nahradí. Kreslicí bloky nevnořujte. JOLT_DEBUG_SURFACES ukazuje hrany a přední směr i skrytých platných displejů.
Přehled API#
Signatury veřejných funkcí a metod. Metody volejte na vrácené instanci; parametry s výchozí hodnotou jsou volitelné.
Související návody#
Ověřené kontrakty operací#
Následující kontrakty rozlišují jednotky, návratové hodnoty, chyby a životnost podle aktuální implementace. Nevynechávej kontrolu výsledku: false, 0 a undefined mohou mít u různých metod odlišný význam.
| Symbol / vlastník | Signatura | Kontrakt operace |
|---|---|---|
| jolt_asset_create_surface | jolt_asset_create_surface(asset,surface_ref,body) | Živý managed owner a asset reference → JoltRenderSurface/undefined. GPU alokace až při Draw. Default visibletrue, width512px, height dle poměru stran clamp1..2048, update_rate0. Opaque +Z front, nikoliv kolizní těleso. |
| jolt_asset_get_surface | jolt_asset_get_surface(asset,surface_ref) | Asset + key/UUID → nezávislý validovaný Render Surface záznam, chyba undefined. |
| JoltRenderSurface.destroy | JoltRenderSurface.destroy() | Boolean idempotentní; odstraní renderer vazbu, texturu, kameru, mesh a materiál. Během aktivního kreslení odmítá; ownera neničí. |
| JoltRenderSurface.draw_begin | JoltRenderSurface.draw_begin() | Draw/Draw Begin před BBMOD: kresli jen když begin vrátí true a vždy páruj end. Begin false může znamenat, že ještě není čas obnovy. Úspěšný begin vypne callback; nested bloky odmítá, end obnoví GPU/matice/shader, výsledek opaque. |
| JoltRenderSurface.draw_end | JoltRenderSurface.draw_end() | Draw/Draw Begin před BBMOD: kresli jen když begin vrátí true a vždy páruj end. Begin false může znamenat, že ještě není čas obnovy. Úspěšný begin vypne callback; nested bloky odmítá, end obnoví GPU/matice/shader, výsledek opaque. |
| JoltRenderSurface.get_local_transform | JoltRenderSurface.get_local_transform() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_position | JoltRenderSurface.get_position() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_resolution | JoltRenderSurface.get_resolution() | Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera. |
| JoltRenderSurface.get_rotation | JoltRenderSurface.get_rotation() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_size | JoltRenderSurface.get_size() | Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera. |
| JoltRenderSurface.get_transform | JoltRenderSurface.get_transform() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_x | JoltRenderSurface.get_x() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_y | JoltRenderSurface.get_y() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.get_z | JoltRenderSurface.get_z() | Stejná prostorová konvence jako AssetPoint: světový transform/pozice/quaternion/složka, pouze get_local_transform místní. undefined při chybě. |
| JoltRenderSurface.is_valid | JoltRenderSurface.is_valid() | Boolean živého helperu a ownera; neznamená alokovanou GPU texturu. |
| JoltRenderSurface.is_visible | JoltRenderSurface.is_visible() | Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera. |
| JoltRenderSurface.render | JoltRenderSurface.render() | BBMOD renderable callback, bez návratového potvrzení. Připraví aktuální texturu a vloží plochu do renderování; skrytý/neplatný se nevykreslí. |
| JoltRenderSurface.set_draw_callback | JoltRenderSurface.set_draw_callback(callback) | Metoda callback(width, height) nebo undefined, Boolean. Přepne z ručního kreslení na callback, obnoví obsah při příštím renderu. |
| JoltRenderSurface.set_position | JoltRenderSurface.set_position(x,y,z) | Boolean; místní XYZ m / Euler XYZ°, owner se nepřesune. Nesmí se měnit během draw_begin/end. |
| JoltRenderSurface.set_renderer | JoltRenderSurface.set_renderer(renderer) | BBMOD_BaseRenderer nebo undefined; Boolean. Sám remove/add při změně, nepřidávej podruhé. |
| JoltRenderSurface.set_resolution | JoltRenderSurface.set_resolution(width,height) | Boolean; rozlišení celé1..2048px na osu, rate0..1000Hz, 0 každý renderovaný frame. Změna označí obsah k obnově; setter nealokuje GPU. |
| JoltRenderSurface.set_rotation_euler | JoltRenderSurface.set_rotation_euler(x,y,z) | Boolean; místní XYZ m / Euler XYZ°, owner se nepřesune. Nesmí se měnit během draw_begin/end. |
| JoltRenderSurface.set_size | JoltRenderSurface.set_size(width,height) | Boolean; konečná width/height .0001..10000 m. |
| JoltRenderSurface.set_update_rate | JoltRenderSurface.set_update_rate(hz) | Boolean; rozlišení celé1..2048px na osu, rate0..1000Hz, 0 každý renderovaný frame. Změna označí obsah k obnově; setter nealokuje GPU. |
| JoltRenderSurface.set_visible | JoltRenderSurface.set_visible(value) | Striktní Boolean → Boolean; skrytí zruší touch capture. |