Aktuální projekt

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.

Render Surface v Blenderu: tyrkysový obdélník s vodicími šipkami a osami JoltPhysics Root.
Render Surface s JoltPhysics Root v Blenderu.

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.

Panel Render Surface v Blenderu s poli Key, Display Name, Width, Height, Position a Rotation.
Nastavení klíče, názvu, rozměrů a transformace Render Surface.

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:

GML
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.

GML
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:

GML
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é.

Funkce / metodaSignatura
jolt_asset_create_surfacejolt_asset_create_surface(asset,surface_ref,body)
jolt_asset_get_surfacejolt_asset_get_surface(asset,surface_ref)
JoltRenderSurface.destroyJoltRenderSurface.destroy()
JoltRenderSurface.draw_beginJoltRenderSurface.draw_begin()
JoltRenderSurface.draw_endJoltRenderSurface.draw_end()
JoltRenderSurface.get_local_transformJoltRenderSurface.get_local_transform()
JoltRenderSurface.get_positionJoltRenderSurface.get_position()
JoltRenderSurface.get_resolutionJoltRenderSurface.get_resolution()
JoltRenderSurface.get_rotationJoltRenderSurface.get_rotation()
JoltRenderSurface.get_sizeJoltRenderSurface.get_size()
JoltRenderSurface.get_transformJoltRenderSurface.get_transform()
JoltRenderSurface.get_xJoltRenderSurface.get_x()
JoltRenderSurface.get_yJoltRenderSurface.get_y()
JoltRenderSurface.get_zJoltRenderSurface.get_z()
JoltRenderSurface.is_validJoltRenderSurface.is_valid()
JoltRenderSurface.is_visibleJoltRenderSurface.is_visible()
JoltRenderSurface.renderJoltRenderSurface.render()
JoltRenderSurface.set_draw_callbackJoltRenderSurface.set_draw_callback(callback)
JoltRenderSurface.set_positionJoltRenderSurface.set_position(x,y,z)
JoltRenderSurface.set_rendererJoltRenderSurface.set_renderer(renderer)
JoltRenderSurface.set_resolutionJoltRenderSurface.set_resolution(width,height)
JoltRenderSurface.set_rotation_eulerJoltRenderSurface.set_rotation_euler(x,y,z)
JoltRenderSurface.set_sizeJoltRenderSurface.set_size(width,height)
JoltRenderSurface.set_update_rateJoltRenderSurface.set_update_rate(hz)
JoltRenderSurface.set_visibleJoltRenderSurface.set_visible(value)

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íkSignaturaKontrakt operace
jolt_asset_create_surfacejolt_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_surfacejolt_asset_get_surface(asset,surface_ref)Asset + key/UUID → nezávislý validovaný Render Surface záznam, chyba undefined.
JoltRenderSurface.destroyJoltRenderSurface.destroy()Boolean idempotentní; odstraní renderer vazbu, texturu, kameru, mesh a materiál. Během aktivního kreslení odmítá; ownera neničí.
JoltRenderSurface.draw_beginJoltRenderSurface.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_endJoltRenderSurface.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_transformJoltRenderSurface.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_positionJoltRenderSurface.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_resolutionJoltRenderSurface.get_resolution()Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera.
JoltRenderSurface.get_rotationJoltRenderSurface.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_sizeJoltRenderSurface.get_size()Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera.
JoltRenderSurface.get_transformJoltRenderSurface.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_xJoltRenderSurface.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_yJoltRenderSurface.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_zJoltRenderSurface.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_validJoltRenderSurface.is_valid()Boolean živého helperu a ownera; neznamená alokovanou GPU texturu.
JoltRenderSurface.is_visibleJoltRenderSurface.is_visible()Uložené {width, height} m / pixely, nebo Boolean viditelnosti. Tyto gettery samy neověřují native ownera.
JoltRenderSurface.renderJoltRenderSurface.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_callbackJoltRenderSurface.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_positionJoltRenderSurface.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_rendererJoltRenderSurface.set_renderer(renderer)BBMOD_BaseRenderer nebo undefined; Boolean. Sám remove/add při změně, nepřidávej podruhé.
JoltRenderSurface.set_resolutionJoltRenderSurface.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_eulerJoltRenderSurface.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_sizeJoltRenderSurface.set_size(width,height)Boolean; konečná width/height .0001..10000 m.
JoltRenderSurface.set_update_rateJoltRenderSurface.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_visibleJoltRenderSurface.set_visible(value)Striktní Boolean → Boolean; skrytí zruší touch capture.