rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// util.rs — 複数モジュールから使う小さな共通ヘルパー関数。

/// 任意の `&[T]` をバイト列 `&[u8]` として再解釈する(コピー無し)。
/// 頂点バッファなどを GPU にアップロードする際に使用する。
pub(crate) fn slice_as_bytes<T>(data: &[T]) -> &[u8] {
    unsafe { std::slice::from_raw_parts(data.as_ptr() as *const u8, std::mem::size_of_val(data)) }
}

/// async ランタイムを使わずに `Future` を同期的に最後まで実行する。
/// wgpu の初期化処理(アダプタ/デバイス取得)は async だが、このライブラリは
/// シングルスレッドの同期 API として公開したいためのブロッキングヘルパー。
pub(crate) fn block_on<F: std::future::Future>(f: F) -> F::Output {
    use std::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};
    // 何もしないダミーの Waker(poll がすぐ完了するので目覚まし不要)
    const VTABLE: RawWakerVTable = RawWakerVTable::new(
        |p| RawWaker::new(p, &VTABLE),
        |_| {}, |_| {}, |_| {},
    );
    let waker = unsafe { Waker::from_raw(RawWaker::new(std::ptr::null(), &VTABLE)) };
    let mut cx = Context::from_waker(&waker);
    let mut f = std::pin::pin!(f);
    loop {
        if let Poll::Ready(v) = f.as_mut().poll(&mut cx) { return v; }
        std::hint::spin_loop();
    }
}