From 2aac62b2bb69c2414948b61914807f8189a850ce Mon Sep 17 00:00:00 2001 From: pulsareonbot Date: Tue, 7 Jul 2026 16:04:49 +0800 Subject: [PATCH] feat(live2d): implement OpenGL ES 2.0 rendering backend with EGL support - Add `gl.rs` for OpenGL ES 2.0 and EGL context management. - Introduce `mod.rs` to organize Live2D plugin modules. - Create `model.rs` for loading and managing Cubism models, including parameter handling and drawable data extraction. - Implement shader compilation and rendering context setup for Live2D models. --- .analyze.sh | 21 + .dl_core.sh | 39 ++ .extract.sh | 15 + .gitignore | 1 + .haru.moc3 | Bin 0 -> 384704 bytes .haru.model3.json | 115 +++++ .ssh_check.sh | 23 + src/plugins/live2d/animation.rs | 148 +++++++ src/plugins/live2d/assets.rs | 155 +++++++ src/plugins/live2d/core_ffi.rs | 276 ++++++++++++ src/plugins/live2d/gl.rs | 736 ++++++++++++++++++++++++++++++++ src/plugins/live2d/mod.rs | 19 + src/plugins/live2d/model.rs | 316 ++++++++++++++ src/plugins/mod.rs | 1 + 14 files changed, 1865 insertions(+) create mode 100644 .analyze.sh create mode 100644 .dl_core.sh create mode 100644 .extract.sh create mode 100644 .haru.moc3 create mode 100644 .haru.model3.json create mode 100644 .ssh_check.sh create mode 100644 src/plugins/live2d/animation.rs create mode 100644 src/plugins/live2d/assets.rs create mode 100644 src/plugins/live2d/core_ffi.rs create mode 100644 src/plugins/live2d/gl.rs create mode 100644 src/plugins/live2d/mod.rs create mode 100644 src/plugins/live2d/model.rs diff --git a/.analyze.sh b/.analyze.sh new file mode 100644 index 0000000..297df47 --- /dev/null +++ b/.analyze.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 分析下载页面 +echo "=== Page size ===" +wc -c /tmp/dl_page.html + +echo "=== All URLs containing download/zip/native ===" +grep -oiE 'https?://[^"'\'' <>]+(download|\.zip|native|cubism)[^"'\'' <>]*' /tmp/dl_page.html | sort -u | head -40 + +echo "=== Script sources ===" +grep -oiE ']*src="[^"]*"' /tmp/dl_page.html | head -20 + +echo "=== Data attributes ===" +grep -oiE 'data-[a-z]+="[^"]*"' /tmp/dl_page.html | head -20 + +echo "=== Form actions ===" +grep -oiE ']*action="[^"]*"' /tmp/dl_page.html | head -10 + +echo "=== Any cubism.live2d URLs ===" +grep -oiE 'https?://[a-z.]*live2d[^"'\'' <>]*' /tmp/dl_page.html | sort -u | head -30 + +echo "=== DONE ===" diff --git a/.dl_core.sh b/.dl_core.sh new file mode 100644 index 0000000..6399a33 --- /dev/null +++ b/.dl_core.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# 尝试下载 Cubism SDK for Native (含 Core 库) +cd /tmp +echo "=== Try downloading Cubism SDK for Native ===" + +# Live2D 官方下载通常用这种 URL 模式 +# 先尝试常见的下载链接 +URLS=( + "https://cubism.live2d.com/sdk-native/bin/CubismSdkForNative.zip" + "https://www.live2d.com/download/cubism-sdk/download-native/?agree=true" + "https://download.live2d.com/cubism-sdk/native/CubismSdkForNative.zip" +) + +for url in "${URLS[@]}"; do + echo "Trying: $url" + wget --timeout=15 --tries=1 -q "$url" -O test_download.bin 2>&1 + if [ $? -eq 0 ]; then + SIZE=$(stat -c%s test_download.bin 2>/dev/null || echo 0) + echo " Downloaded: $SIZE bytes" + if [ "$SIZE" -gt 100000 ]; then + echo " Looks like a real file! Checking type..." + file test_download.bin + mv test_download.bin CubismSdkForNative.zip + echo " SUCCESS: saved as CubismSdkForNative.zip" + exit 0 + fi + else + echo " Failed or too small" + fi + rm -f test_download.bin +done + +echo "=== Direct URL attempts failed ===" +echo "Checking actual download page for hidden links..." +curl -sL "https://www.live2d.com/zh-CHS/sdk/download/native/" 2>/dev/null | grep -oiE 'href="[^"]*\.zip[^"]*"' | head -10 +echo "---" +curl -sL "https://www.live2d.com/download/cubism-sdk/download-native/" 2>/dev/null | grep -oiE 'href="[^"]*download[^"]*"' | head -10 + +echo "=== DONE ===" diff --git a/.extract.sh b/.extract.sh new file mode 100644 index 0000000..52dd709 --- /dev/null +++ b/.extract.sh @@ -0,0 +1,15 @@ +#!/bin/bash +cd /tmp +echo "=== Extracting SDK ===" +unzip -o cubism_sdk_native.zip -d cubism_sdk 2>&1 | tail -5 + +echo "=== Finding Core .so files ===" +find cubism_sdk -name "libLive2DCubismCore*" -type f 2>/dev/null + +echo "=== Checking arm64 linux .so ===" +ls -lh cubism_sdk/Core/dll/experimental/linux/arm64/ 2>/dev/null + +echo "=== File type ===" +file cubism_sdk/Core/dll/experimental/linux/arm64/libLive2DCubismCore.so 2>/dev/null + +echo "=== DONE ===" diff --git a/.gitignore b/.gitignore index b9313f9..98a12c3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ target/ *.swp *.swo *~ +extern/ # 模型文件不进 git,只保留下载链接在 model_manager.rs 清单里 model_download/ model_store/ diff --git a/.haru.moc3 b/.haru.moc3 new file mode 100644 index 0000000000000000000000000000000000000000..e5fc43a78cb8b2c6cd4d5601ef56019bd628d6c3 GIT binary patch literal 384704 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Ν>(v+^{7`II;>Wy>n2eo&)=L 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/dev/null && echo "wget: yes" || echo "wget: no" +which curl 2>/dev/null && echo "curl: yes" || echo "curl: no" + +echo "=== OPENGL/EGL LIBS ===" +ls /usr/lib/aarch64-linux-gnu/libEGL* 2>/dev/null || echo "no EGL lib" +ls /usr/lib/aarch64-linux-gnu/libGLESv2* 2>/dev/null || echo "no GLES lib" +ls /usr/lib/aarch64-linux-gnu/libGL* 2>/dev/null || echo "no GL lib" + +echo "=== PKG CONFIG ===" +pkg-config --list-all 2>/dev/null | grep -iE 'egl|gles|gl' || echo "no pkg-config gl" + +echo "=== BUILD TOOLS ===" +gcc --version 2>/dev/null | head -1 || echo "no gcc" +g++ --version 2>/dev/null | head -1 || echo "no g++" +cmake --version 2>/dev/null | head -1 || echo "no cmake" + +echo "=== RUST ===" +ls ~/.rustup/toolchains/*/bin/rustc 2>/dev/null | head -1 +~/.rustup/toolchains/stable-aarch64-unknown-linux-gnu/bin/rustc --version 2>/dev/null + +echo "=== DONE ===" diff --git a/src/plugins/live2d/animation.rs b/src/plugins/live2d/animation.rs new file mode 100644 index 0000000..9423f1d --- /dev/null +++ b/src/plugins/live2d/animation.rs @@ -0,0 +1,148 @@ +//! 动画系统:眨眼、嘴部动效、待机呼吸 + +use super::core_ffi::CubismCore; +use super::model::CubismModel; +use std::time::{Duration, Instant}; + +/// 动画状态 +pub struct AnimationState { + /// 眨眼定时器 + last_blink: Instant, + next_blink_interval: Duration, + blink_phase: BlinkPhase, + /// 嘴部状态 + talking: bool, + mouth_open: f32, + mouth_target: f32, + last_mouth_update: Instant, + /// 呼吸 + breath_phase: f32, + /// 身体摇摆 + body_phase: f32, + /// 眼球跟随(简化为固定值) + eye_ball_x: f32, + eye_ball_y: f32, +} + +#[derive(Clone, Copy, Debug)] +enum BlinkPhase { + Idle, + Closing(f32), // 0→1 + Opening(f32), // 1→0 +} + +impl Default for AnimationState { + fn default() -> Self { + Self { + last_blink: Instant::now(), + next_blink_interval: Duration::from_secs(3), + blink_phase: BlinkPhase::Idle, + talking: false, + mouth_open: 0.0, + mouth_target: 0.0, + last_mouth_update: Instant::now(), + breath_phase: 0.0, + body_phase: 0.0, + eye_ball_x: 0.0, + eye_ball_y: 0.0, + } + } +} + +impl AnimationState { + pub fn set_talking(&mut self, talking: bool) { + self.talking = talking; + if !talking { + self.mouth_target = 0.0; + } + } + + /// 更新动画并应用到 model 参数 + pub fn update(&mut self, core: &CubismCore, model: &CubismModel, now: Instant, dt: f32) { + // === 呼吸 === + self.breath_phase += dt * 0.5; // 0.5 Hz + let breath = self.breath_phase.sin() * 0.5 + 0.5; + model.set_param(core, "ParamBreath", breath); + + // === 身体摇摆 === + self.body_phase += dt * 0.3; + let body_x = self.body_phase.sin() * 8.0; + let body_y = self.body_phase.sin() * 0.5; + model.set_param(core, "ParamBodyAngleX", body_x); + model.set_param(core, "ParamBodyAngleY", body_y); + + // === 眨眼 === + self.update_blink(now, core, model); + + // === 嘴部 === + self.update_mouth(now, dt, core, model); + + // === 眼球(轻微随机移动)=== + self.eye_ball_x = (now.elapsed().as_secs_f32() * 0.3).sin() * 0.3; + self.eye_ball_y = (now.elapsed().as_secs_f32() * 0.2).cos() * 0.2; + model.set_param(core, "ParamEyeBallX", self.eye_ball_x); + model.set_param(core, "ParamEyeBallY", self.eye_ball_y); + } + + fn update_blink(&mut self, now: Instant, core: &CubismCore, model: &CubismModel) { + match &mut self.blink_phase { + BlinkPhase::Idle => { + if now.duration_since(self.last_blink) >= self.next_blink_interval { + self.blink_phase = BlinkPhase::Closing(0.0); + self.last_blink = now; + } + } + BlinkPhase::Closing(t) => { + *t += 0.15; // 闭眼速度 + if *t >= 1.0 { + *t = 1.0; + self.blink_phase = BlinkPhase::Opening(1.0); + } + let eye_open = 1.0 - *t; + model.set_param(core, "ParamEyeLOpen", eye_open); + model.set_param(core, "ParamEyeROpen", eye_open); + } + BlinkPhase::Opening(t) => { + *t -= 0.1; // 睁眼速度(比闭眼慢) + if *t <= 0.0 { + *t = 0.0; + self.blink_phase = BlinkPhase::Idle; + self.last_blink = now; + // 下次眨眼间隔(2-5 秒随机) + self.next_blink_interval = + Duration::from_secs(2 + (now.elapsed().as_nanos() % 3) as u64); + } + let eye_open = 1.0 - *t; + model.set_param(core, "ParamEyeLOpen", eye_open); + model.set_param(core, "ParamEyeROpen", eye_open); + } + } + } + + fn update_mouth( + &mut self, + now: Instant, + dt: f32, + core: &CubismCore, + model: &CubismModel, + ) { + if self.talking { + // 说话时嘴部快速开合 + let t = now.elapsed().as_secs_f32(); + // 用多个正弦叠加产生自然的变化 + let base = (t * 12.0).sin() * 0.4 + (t * 7.0).sin() * 0.3 + (t * 19.0).sin() * 0.2; + self.mouth_target = (base * 0.5 + 0.5).clamp(0.0, 1.0) * 0.9 + 0.1; + } else { + self.mouth_target = 0.0; + } + + // 平滑过渡 + let lerp_speed = 15.0 * dt; + self.mouth_open += (self.mouth_target - self.mouth_open) * lerp_speed.min(1.0); + model.set_param(core, "ParamMouthOpenY", self.mouth_open); + + // 嘴部形态也轻微变化 + let form = (now.elapsed().as_secs_f32() * 3.0).sin() * 0.3 * if self.talking { 1.0 } else { 0.0 }; + model.set_param(core, "ParamMouthForm", form); + } +} diff --git a/src/plugins/live2d/assets.rs b/src/plugins/live2d/assets.rs new file mode 100644 index 0000000..61606af --- /dev/null +++ b/src/plugins/live2d/assets.rs @@ -0,0 +1,155 @@ +//! 资源管理:model3.json 解析 + PNG 纹理加载 + +use anyhow::{anyhow, Context, Result}; +use serde::Deserialize; +use std::path::{Path, PathBuf}; + +/// model3.json 中的 Groups 条目 +#[derive(Deserialize, Clone, Debug)] +pub struct ModelGroup { + #[serde(rename = "Target")] + pub target: String, + #[serde(rename = "Name")] + pub name: String, + #[serde(rename = "Ids")] + pub ids: Vec, +} + +/// model3.json 文件引用 +#[derive(Deserialize, Clone, Debug)] +pub struct FileReferences { + #[serde(rename = "Moc")] + pub moc: String, + #[serde(rename = "Textures", default)] + pub textures: Vec, + #[serde(rename = "Physics", default)] + pub physics: Option, + #[serde(rename = "Pose", default)] + pub pose: Option, + #[serde(rename = "DisplayInfo", default)] + pub display_info: Option, +} + +/// model3.json 根结构 +#[derive(Deserialize, Clone, Debug)] +pub struct Model3Json { + #[serde(rename = "Version")] + pub version: i32, + #[serde(rename = "FileReferences")] + pub file_references: FileReferences, + #[serde(rename = "Groups", default)] + pub groups: Vec, +} + +impl Model3Json { + /// 从文件解析 + pub fn from_path(path: &Path) -> Result { + let text = std::fs::read_to_string(path) + .with_context(|| format!("读取 model3.json 失败: {}", path.display()))?; + let json: Model3Json = serde_json::from_str(&text) + .with_context(|| format!("解析 model3.json 失败: {}", path.display()))?; + Ok(json) + } + + /// 获取 LipSync 参数 ID 列表 + pub fn lip_sync_ids(&self) -> Vec { + self.groups + .iter() + .find(|g| g.target == "Parameter" && g.name == "LipSync") + .map(|g| g.ids.clone()) + .unwrap_or_else(|| vec!["ParamMouthOpenY".to_string()]) + } + + /// 获取 EyeBlink 参数 ID 列表 + pub fn eye_blink_ids(&self) -> Vec { + self.groups + .iter() + .find(|g| g.target == "Parameter" && g.name == "EyeBlink") + .map(|g| g.ids.clone()) + .unwrap_or_else(|| { + vec!["ParamEyeLOpen".to_string(), "ParamEyeROpen".to_string()] + }) + } +} + +/// 加载的纹理图像(RGBA) +pub struct TextureImage { + pub width: u32, + pub height: u32, + pub rgba: Vec, +} + +/// 加载 PNG 纹理(使用 image crate) +pub fn load_texture(path: &Path) -> Result { + let img = image::open(path) + .with_context(|| format!("加载纹理失败: {}", path.display()))? + .to_rgba8(); + let width = img.width(); + let height = img.height(); + let rgba = img.into_raw(); + Ok(TextureImage { + width, + height, + rgba, + }) +} + +/// 加载 model3.json 引用的所有纹理(返回按 texture_00, texture_01 顺序的列表) +pub fn load_all_textures( + model3_dir: &Path, + file_refs: &FileReferences, +) -> Result> { + let mut textures = Vec::new(); + for tex_rel in &file_refs.textures { + let tex_path = model3_dir.join(tex_rel); + let img = load_texture(&tex_path)?; + println!( + "[Live2D] 纹理加载: {} ({}x{})", + tex_rel, img.width, img.height + ); + textures.push(img); + } + Ok(textures) +} + +/// 解析 model3.json 并返回完整路径集 +pub struct ModelAssetPaths { + pub model3_json: PathBuf, + pub model3_dir: PathBuf, + pub moc3: PathBuf, + pub textures: Vec, +} + +/// 从 model3.json 相对路径(如 "haru/Haru.model3.json")解析资源路径 +pub fn resolve_asset_paths( + live2d_base_dir: &Path, + model3_json_rel: &str, +) -> Result { + let model3_json = live2d_base_dir.join(model3_json_rel); + if !model3_json.exists() { + return Err(anyhow!( + "model3.json 不存在: {}", + model3_json.display() + )); + } + let model3_dir = model3_json + .parent() + .ok_or_else(|| anyhow!("无法获取 model3.json 的父目录"))? + .to_path_buf(); + + let model3 = Model3Json::from_path(&model3_json)?; + let moc3 = model3_dir.join(&model3.file_references.moc); + let textures = model3 + .file_references + .textures + .iter() + .map(|t| model3_dir.join(t)) + .collect(); + + Ok(ModelAssetPaths { + model3_json, + model3_dir, + moc3, + textures, + }) +} diff --git a/src/plugins/live2d/core_ffi.rs b/src/plugins/live2d/core_ffi.rs new file mode 100644 index 0000000..1f1f2b1 --- /dev/null +++ b/src/plugins/live2d/core_ffi.rs @@ -0,0 +1,276 @@ +//! Cubism Core FFI 绑定 +//! +//! 直接对应 `Live2DCubismCore.h` 的 C API。 +//! 动态加载 libLive2DCubismCore.so(需 libm.so 预加载,因 Core 内部使用 powf)。 + +use libloading::{Library, Symbol}; +use std::ffi::CString; +use std::os::raw::{c_char, c_int, c_uchar, c_uint, c_void}; + +/// moc 对齐要求(字节) +pub const CSM_ALIGNOF_MOC: usize = 64; +/// model 对齐要求(字节) +pub const CSM_ALIGNOF_MODEL: usize = 16; + +/// 可绘制常量标志位 +pub mod constant_flags { + pub const BLEND_ADDITIVE: u8 = 1 << 0; + pub const BLEND_MULTIPLICATIVE: u8 = 1 << 1; + pub const IS_DOUBLE_SIDED: u8 = 1 << 2; + pub const IS_INVERTED_MASK: u8 = 1 << 3; +} + +/// 可绘制动态标志位 +pub mod dynamic_flags { + pub const IS_VISIBLE: u8 = 1 << 0; + pub const VISIBILITY_DID_CHANGE: u8 = 1 << 1; + pub const OPACITY_DID_CHANGE: u8 = 1 << 2; + pub const DRAW_ORDER_DID_CHANGE: u8 = 1 << 3; + pub const RENDER_ORDER_DID_CHANGE: u8 = 1 << 4; + pub const VERTEX_POSITIONS_DID_CHANGE: u8 = 1 << 5; + pub const BLEND_COLOR_DID_CHANGE: u8 = 1 << 6; +} + +/// 混合模式 +pub mod blend_mode { + pub const NORMAL: c_int = 0; + pub const ADDITIVE: c_int = 1; + pub const MULTIPLICATIVE: c_int = 2; +} + +#[repr(C)] +#[derive(Clone, Copy, Debug, Default)] +pub struct CsmVector2 { + pub x: f32, + pub y: f32, +} + +#[repr(C)] +#[derive(Clone, Copy, Debug, Default)] +pub struct CsmVector4 { + pub x: f32, + pub y: f32, + pub z: f32, + pub w: f32, +} + +/// Cubism Core 动态加载封装 +pub struct CubismCore { + _libm: Library, + _lib: Library, + pub csm_get_version: unsafe extern "C" fn() -> c_uint, + pub csm_get_latest_moc_version: unsafe extern "C" fn() -> c_uint, + pub csm_get_moc_version: + unsafe extern "C" fn(address: *const c_void, size: c_uint) -> c_uint, + pub csm_has_moc_consistency: + unsafe extern "C" fn(address: *mut c_void, size: c_uint) -> c_int, + pub csm_revive_moc_in_place: + unsafe extern "C" fn(address: *mut c_void, size: c_uint) -> *mut c_void, + pub csm_get_sizeof_model: unsafe extern "C" fn(moc: *const c_void) -> c_uint, + pub csm_initialize_model_in_place: unsafe extern "C" fn( + moc: *const c_void, + address: *mut c_void, + size: c_uint, + ) -> *mut c_void, + pub csm_update_model: unsafe extern "C" fn(model: *mut c_void), + pub csm_get_render_orders: unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_read_canvas_info: unsafe extern "C" fn( + model: *const c_void, + out_size: *mut CsmVector2, + out_origin: *mut CsmVector2, + out_ppu: *mut f32, + ), + pub csm_get_parameter_count: unsafe extern "C" fn(model: *const c_void) -> c_int, + pub csm_get_parameter_ids: + unsafe extern "C" fn(model: *const c_void) -> *const *const c_char, + pub csm_get_parameter_minimum_values: + unsafe extern "C" fn(model: *const c_void) -> *const f32, + pub csm_get_parameter_maximum_values: + unsafe extern "C" fn(model: *const c_void) -> *const f32, + pub csm_get_parameter_default_values: + unsafe extern "C" fn(model: *const c_void) -> *const f32, + pub csm_get_parameter_values: unsafe extern "C" fn(model: *mut c_void) -> *mut f32, + pub csm_get_part_count: unsafe extern "C" fn(model: *const c_void) -> c_int, + pub csm_get_part_opacities: unsafe extern "C" fn(model: *mut c_void) -> *mut f32, + pub csm_get_drawable_count: unsafe extern "C" fn(model: *const c_void) -> c_int, + pub csm_get_drawable_ids: + unsafe extern "C" fn(model: *const c_void) -> *const *const c_char, + pub csm_get_drawable_constant_flags: + unsafe extern "C" fn(model: *const c_void) -> *const c_uchar, + pub csm_get_drawable_dynamic_flags: + unsafe extern "C" fn(model: *const c_void) -> *const c_uchar, + pub csm_get_drawable_blend_modes: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_texture_indices: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_draw_orders: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_opacities: + unsafe extern "C" fn(model: *const c_void) -> *const f32, + pub csm_get_drawable_mask_counts: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_masks: + unsafe extern "C" fn(model: *const c_void) -> *const *const c_int, + pub csm_get_drawable_vertex_counts: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_vertex_positions: + unsafe extern "C" fn(model: *const c_void) -> *const *const CsmVector2, + pub csm_get_drawable_vertex_uvs: + unsafe extern "C" fn(model: *const c_void) -> *const *const CsmVector2, + pub csm_get_drawable_index_counts: + unsafe extern "C" fn(model: *const c_void) -> *const c_int, + pub csm_get_drawable_indices: + unsafe extern "C" fn(model: *const c_void) -> *const *const u16, + pub csm_get_drawable_multiply_colors: + unsafe extern "C" fn(model: *const c_void) -> *const CsmVector4, + pub csm_get_drawable_screen_colors: + unsafe extern "C" fn(model: *const c_void) -> *const CsmVector4, + pub csm_reset_drawable_dynamic_flags: unsafe extern "C" fn(model: *mut c_void), +} + +impl CubismCore { + /// 加载 Cubism Core 动态库 + /// + /// `so_path` 为 libLive2DCubismCore.so 的路径。 + /// 内部会先 dlopen libm.so(Core 依赖 powf 但 NEEDED 未声明)。 + pub fn load(so_path: &str) -> anyhow::Result { + // 预加载 libm,RTLD_GLOBAL 让后续 .so 能解析到 powf + let libm = unsafe { + Library::new("libm.so.6").or_else(|_| Library::new("libm.so.6.1"))? + }; + + let lib = unsafe { Library::new(so_path)? }; + + unsafe { + Ok(Self { + csm_get_version: *lib.get(b"csmGetVersion\0")?, + csm_get_latest_moc_version: *lib.get(b"csmGetLatestMocVersion\0")?, + csm_get_moc_version: *lib.get(b"csmGetMocVersion\0")?, + csm_has_moc_consistency: *lib.get(b"csmHasMocConsistency\0")?, + csm_revive_moc_in_place: *lib.get(b"csmReviveMocInPlace\0")?, + csm_get_sizeof_model: *lib.get(b"csmGetSizeofModel\0")?, + csm_initialize_model_in_place: *lib.get(b"csmInitializeModelInPlace\0")?, + csm_update_model: *lib.get(b"csmUpdateModel\0")?, + csm_get_render_orders: *lib.get(b"csmGetRenderOrders\0")?, + csm_read_canvas_info: *lib.get(b"csmReadCanvasInfo\0")?, + csm_get_parameter_count: *lib.get(b"csmGetParameterCount\0")?, + csm_get_parameter_ids: *lib.get(b"csmGetParameterIds\0")?, + csm_get_parameter_minimum_values: *lib + .get(b"csmGetParameterMinimumValues\0")?, + csm_get_parameter_maximum_values: *lib + .get(b"csmGetParameterMaximumValues\0")?, + csm_get_parameter_default_values: *lib + .get(b"csmGetParameterDefaultValues\0")?, + csm_get_parameter_values: *lib.get(b"csmGetParameterValues\0")?, + csm_get_part_count: *lib.get(b"csmGetPartCount\0")?, + csm_get_part_opacities: *lib.get(b"csmGetPartOpacities\0")?, + csm_get_drawable_count: *lib.get(b"csmGetDrawableCount\0")?, + csm_get_drawable_ids: *lib.get(b"csmGetDrawableIds\0")?, + csm_get_drawable_constant_flags: *lib + .get(b"csmGetDrawableConstantFlags\0")?, + csm_get_drawable_dynamic_flags: *lib + .get(b"csmGetDrawableDynamicFlags\0")?, + csm_get_drawable_blend_modes: *lib.get(b"csmGetDrawableBlendModes\0")?, + csm_get_drawable_texture_indices: *lib + .get(b"csmGetDrawableTextureIndices\0")?, + csm_get_drawable_draw_orders: *lib.get(b"csmGetDrawableDrawOrders\0")?, + csm_get_drawable_opacities: *lib.get(b"csmGetDrawableOpacities\0")?, + csm_get_drawable_mask_counts: *lib.get(b"csmGetDrawableMaskCounts\0")?, + csm_get_drawable_masks: *lib.get(b"csmGetDrawableMasks\0")?, + csm_get_drawable_vertex_counts: *lib + .get(b"csmGetDrawableVertexCounts\0")?, + csm_get_drawable_vertex_positions: *lib + .get(b"csmGetDrawableVertexPositions\0")?, + csm_get_drawable_vertex_uvs: *lib.get(b"csmGetDrawableVertexUvs\0")?, + csm_get_drawable_index_counts: *lib.get(b"csmGetDrawableIndexCounts\0")?, + csm_get_drawable_indices: *lib.get(b"csmGetDrawableIndices\0")?, + csm_get_drawable_multiply_colors: *lib + .get(b"csmGetDrawableMultiplyColors\0")?, + csm_get_drawable_screen_colors: *lib + .get(b"csmGetDrawableScreenColors\0")?, + csm_reset_drawable_dynamic_flags: *lib + .get(b"csmResetDrawableDynamicFlags\0")?, + _libm: libm, + _lib: lib, + }) + } + } + + /// 查询 Core 版本(返回原始 u32,格式 0xMMmmpppp) + pub fn version(&self) -> u32 { + unsafe { (self.csm_get_version)() } + } + + /// 格式化版本号为 "major.minor.patch" + pub fn version_string(&self) -> String { + let v = self.version(); + format!( + "{}.{}.{}", + (v >> 24) & 0xFF, + (v >> 16) & 0xFF, + v & 0xFFFF + ) + } +} + +/// 分配对齐内存(返回对齐指针和底层分配,底层分配需保持存活) +pub fn alloc_aligned(size: usize, align: usize) -> anyhow::Result { + let layout = std::alloc::Layout::from_size_align(size, align)?; + let ptr = unsafe { std::alloc::alloc(layout) }; + if ptr.is_null() { + anyhow::bail!("aligned alloc failed for size={size} align={align}"); + } + Ok(AlignedBuffer { ptr, layout }) +} + +pub struct AlignedBuffer { + ptr: *mut u8, + layout: std::alloc::Layout, +} + +impl AlignedBuffer { + pub fn as_ptr(&self) -> *mut u8 { + self.ptr + } + pub fn as_mut_void(&mut self) -> *mut c_void { + self.ptr as *mut c_void + } + pub fn as_void(&self) -> *const c_void { + self.ptr as *const c_void + } +} + +impl Drop for AlignedBuffer { + fn drop(&mut self) { + unsafe { std::alloc::dealloc(self.ptr, self.layout) } + } +} + +unsafe impl Send for AlignedBuffer {} +unsafe impl Sync for AlignedBuffer {} + +/// 将 C 字符串指针转换为 Rust String(空指针返回 None) +pub unsafe fn cstr_ptr_to_string(ptr: *const c_char) -> Option { + if ptr.is_null() { + return None; + } + let raw = std::slice::from_raw_parts(ptr as *const u8, libc_strlen(ptr)); + Some(String::from_utf8_lossy(raw).into_owned()) +} + +/// 简易 strlen(避免依赖 libc crate) +unsafe fn libc_strlen(ptr: *const c_char) -> usize { + let mut p = ptr as *const u8; + let mut n = 0; + while *p != 0 { + p = p.add(1); + n += 1; + } + n +} + +// 保留 CString 防止 unused 警告(未来日志函数需要) +#[allow(dead_code)] +fn _ensure_cstring_linked() -> CString { + CString::new("").unwrap() +} diff --git a/src/plugins/live2d/gl.rs b/src/plugins/live2d/gl.rs new file mode 100644 index 0000000..1437039 --- /dev/null +++ b/src/plugins/live2d/gl.rs @@ -0,0 +1,736 @@ +//! OpenGL ES 2.0 / EGL 渲染后端 +//! +//! 使用 EGL 创建离屏 PBuffer 上下文(无窗口),用 OpenGL ES 2.0 渲染 Live2D 模型。 +//! 渲染结果通过 glReadPixels 读取,交给 video 插件或直接显示。 +//! +//! 这里采用 X11 窗口方式渲染(设备有 X11 + kwin),直接显示到屏幕。 +//! 如需离屏渲染可改为 PBuffer。 + +use anyhow::{anyhow, Context, Result}; +use std::ffi::c_void; +use std::os::raw::{c_char, c_int, c_uint, c_void as c_void_raw}; + +// ============ EGL 类型与常量 ============ + +pub mod egl { + pub const EGL_VERSION_1_5: c_int = 1; + + pub const EGL_SURFACE_TYPE: c_int = 0x3033; + pub const EGL_WINDOW_BIT: c_int = 0x0004; + pub const EGL_PBUFFER_BIT: c_int = 0x0001; + pub const EGL_BLUE_SIZE: c_int = 0x3022; + pub const EGL_GREEN_SIZE: c_int = 0x3023; + pub const EGL_RED_SIZE: c_int = 0x3024; + pub const EGL_DEPTH_SIZE: c_int = 0x3025; + pub const EGL_ALPHA_SIZE: c_int = 0x3021; + pub const EGL_STENCIL_SIZE: c_int = 0x3026; + pub const EGL_RENDERABLE_TYPE: c_int = 0x3040; + pub const EGL_OPENGL_ES2_BIT: c_int = 0x0004; + pub const EGL_NONE: c_int = 0x3038; + pub const EGL_CONTEXT_CLIENT_VERSION: c_int = 0x3098; + + pub const EGL_DISPLAY: usize = 0; + pub const EGL_NO_DISPLAY: isize = 0; + pub const EGL_NO_CONTEXT: isize = 0; + pub const EGL_NO_SURFACE: isize = 0; + + pub type EGLDisplay = *mut c_void; + pub type EGLConfig = *mut c_void; + pub type EGLContext = *mut c_void; + pub type EGLSurface = *mut c_void; + pub type NativeDisplayType = *mut c_void; + pub type NativeWindowType = *mut c_void; + pub type EGLBoolean = c_uint; + pub type EGLint = c_int; +} + +// ============ X11 类型 ============ + +pub mod x11 { + use std::os::raw::{c_long, c_uint, c_void}; + + pub type Display = c_void; + pub type Window = c_long; + pub type XID = c_long; + + #[repr(C)] + pub struct XSetWindowAttributes { + pub background_pixmap: c_long, + pub background_pixel: c_long, + pub border_pixmap: c_long, + pub border_pixel: c_long, + pub bit_gravity: c_int, + pub win_gravity: c_int, + pub backing_store: c_int, + pub backing_planes: c_long, + pub backing_pixel: c_long, + pub save_under: c_int, + pub event_mask: c_long, + pub do_not_propagate_mask: c_long, + pub override_redirect: c_int, + pub colormap: c_long, + pub cursor: c_long, + } + + pub const CWOverrideRedirect: c_long = 1 << 9; + pub const CWEventMask: c_long = 1 << 11; + pub const ExposureMask: c_long = 1 << 15; + pub const StructureNotifyMask: c_long = 1 << 17; + pub const KeyPressMask: c_long = 1 << 0; +} + +// ============ GLES2 类型与常量 ============ + +pub mod gl { + use std::os::raw::{c_int, c_uint}; + + pub type GLenum = c_uint; + pub type GLuint = c_uint; + pub type GLint = c_int; + pub type GLsizei = c_int; + pub type GLbitfield = c_uint; + pub type GLfloat = f32; + + pub const GL_FLOAT: GLenum = 0x1406; + pub const GL_FLOAT_VEC2: GLenum = 0x8B50; + pub const GL_FLOAT_VEC4: GLenum = 0x8B52; + pub const GL_FLOAT_MAT4: GLenum = 0x8B5C; + pub const GL_SAMPLER_2D: GLenum = 0x8B5E; + + pub const GL_ARRAY_BUFFER: GLenum = 0x8892; + pub const GL_ELEMENT_ARRAY_BUFFER: GLenum = 0x8893; + + pub const GL_TEXTURE_2D: GLenum = 0x0DE1; + pub const GL_TEXTURE0: GLenum = 0x84C0; + pub const GL_RGBA: GLenum = 0x1908; + pub const GL_UNSIGNED_BYTE: GLenum = 0x1401; + pub const GL_UNSIGNED_SHORT: GLenum = 0x1403; + pub const GL_NEAREST: GLenum = 0x2600; + pub const GL_LINEAR: GLenum = 0x2601; + pub const GL_CLAMP_TO_EDGE: GLenum = 0x812F; + pub const GL_TEXTURE_MIN_FILTER: GLenum = 0x2801; + pub const GL_TEXTURE_MAG_FILTER: GLenum = 0x2800; + pub const GL_TEXTURE_WRAP_S: GLenum = 0x2802; + pub const GL_TEXTURE_WRAP_T: GLenum = 0x2803; + + pub const GL_VERTEX_SHADER: GLenum = 0x8B31; + pub const GL_FRAGMENT_SHADER: GLenum = 0x8B30; + pub const GL_COMPILE_STATUS: GLenum = 0x8B81; + pub const GL_LINK_STATUS: GLenum = 0x8B82; + + pub const GL_TRIANGLES: GLenum = 0x0004; + pub const GL_BLEND: GLenum = 0x0BE2; + pub const GL_SRC_ALPHA: GLenum = 0x0302; + pub const GL_ONE_MINUS_SRC_ALPHA: GLenum = 0x0303; + pub const GL_ONE: GLenum = 1; + pub const GL_ZERO: GLenum = 0; + pub const GL_COLOR_BUFFER_BIT: GLbitfield = 0x4000; + pub const GL_DEPTH_BUFFER_BIT: GLbitfield = 0x0100; + pub const GL_BLEND_DST_RGB: GLenum = 0x80C8; + pub const GL_BLEND_SRC_RGB: GLenum = 0x80C9; + pub const GL_BLEND_DST_ALPHA: GLenum = 0x80CA; + pub const GL_BLEND_SRC_ALPHA: GLenum = 0x80CB; + pub const GL_BLEND_EQUATION: GLenum = 0x8009; + pub const GL_FUNC_ADD: GLenum = 0x8006; + pub const GL_FUNC_REVERSE_SUBTRACT: GLenum = 0x800B; + pub const GL_STATIC_DRAW: GLenum = 0x88E4; + pub const GL_FALSE: GLenum = 0; + pub const GL_TRUE: GLenum = 1; + pub const GL_NO_ERROR: GLenum = 0; +} + +/// 着色器源码(标准模式,支持 mask 和非 mask) +pub const VERT_SHADER_SRC: &str = r#"#version 100 +attribute vec4 a_position; +attribute vec2 a_texCoord; +varying vec2 v_texCoord; +uniform mat4 u_matrix; +void main() { + gl_Position = u_matrix * a_position; + v_texCoord = a_texCoord; + v_texCoord.y = 1.0 - v_texCoord.y; +} +"#; + +pub const FRAG_SHADER_SRC: &str = r#"#version 100 +precision highp float; +varying vec2 v_texCoord; +uniform sampler2D s_texture0; +uniform vec4 u_baseColor; +uniform vec4 u_multiplyColor; +uniform vec4 u_screenColor; +void main() { + vec4 texColor = texture2D(s_texture0, v_texCoord); + texColor.rgb = texColor.rgb * u_multiplyColor.rgb; + texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb); + vec4 color = texColor * u_baseColor; + gl_FragColor = vec4(color.rgb * color.a, color.a); +} +"#; + +/// OpenGL ES2 / EGL 动态库函数集合 +pub struct Gl { + _lib_egl: libloading::Library, + _lib_gl: libloading::Library, + _lib_x11: libloading::Library, + // EGL + egl_get_display: + unsafe extern "C" fn(disp: egl::NativeDisplayType) -> egl::EGLDisplay, + egl_initialize: + unsafe extern "C" fn(dpy: egl::EGLDisplay, major: *mut c_int, minor: *mut c_int) -> egl::EGLBoolean, + egl_choose_config: unsafe extern "C" fn( + dpy: egl::EGLDisplay, + attrib_list: *const egl::EGLint, + configs: *mut egl::EGLConfig, + config_size: egl::EGLint, + num_config: *mut egl::EGLint, + ) -> egl::EGLBoolean, + egl_create_window_surface: unsafe extern "C" fn( + dpy: egl::EGLDisplay, + config: egl::EGLConfig, + win: egl::NativeWindowType, + attrib_list: *const egl::EGLint, + ) -> egl::EGLSurface, + egl_create_context: unsafe extern "C" fn( + dpy: egl::EGLDisplay, + config: egl::EGLConfig, + share_ctx: egl::EGLContext, + attrib_list: *const egl::EGLint, + ) -> egl::EGLContext, + egl_make_current: unsafe extern "C" fn( + dpy: egl::EGLDisplay, + draw: egl::EGLSurface, + read: egl::EGLSurface, + ctx: egl::EGLContext, + ) -> egl::EGLBoolean, + egl_swap_buffers: + unsafe extern "C" fn(dpy: egl::EGLDisplay, surface: egl::EGLSurface) -> egl::EGLBoolean, + egl_terminate: unsafe extern "C" fn(dpy: egl::EGLDisplay) -> egl::EGLBoolean, + + // GLES2 + gl_clear: unsafe extern "C" fn(mask: gl::GLbitfield), + gl_clear_color: unsafe extern "C" fn(r: f32, g: f32, b: f32, a: f32), + gl_enable: unsafe extern "C" fn(cap: gl::GLenum), + gl_disable: unsafe extern "C" fn(cap: gl::GLenum), + gl_blend_func: unsafe extern "C" fn(sfactor: gl::GLenum, dfactor: gl::GLenum), + gl_blend_func_separate: unsafe extern "C" fn( + src_rgb: gl::GLenum, + dst_rgb: gl::GLenum, + src_alpha: gl::GLenum, + dst_alpha: gl::GLenum, + ), + gl_viewport: unsafe extern "C" fn(x: gl::GLint, y: gl::GLint, w: gl::GLsizei, h: gl::GLsizei), + gl_create_shader: unsafe extern "C" fn(t: gl::GLenum) -> gl::GLuint, + gl_shader_source: unsafe extern "C" fn( + shader: gl::GLuint, + count: gl::GLsizei, + string: *const *const c_char, + length: *const gl::GLint, + ), + gl_compile_shader: unsafe extern "C" fn(shader: gl::GLuint), + gl_get_shaderiv: unsafe extern "C" fn( + shader: gl::GLuint, + pname: gl::GLenum, + params: *mut gl::GLint, + ), + gl_get_shader_info_log: unsafe extern "C" fn( + shader: gl::GLuint, + buf_size: gl::GLsizei, + length: *mut gl::GLsizei, + info_log: *mut c_char, + ), + gl_create_program: unsafe extern "C" fn() -> gl::GLuint, + gl_attach_shader: unsafe extern "C" fn(program: gl::GLuint, shader: gl::GLuint), + gl_link_program: unsafe extern "C" fn(program: gl::GLuint), + gl_get_programiv: unsafe extern "C" fn( + program: gl::GLuint, + pname: gl::GLenum, + params: *mut gl::GLint, + ), + gl_get_program_info_log: unsafe extern "C" fn( + program: gl::GLuint, + buf_size: gl::GLsizei, + length: *mut gl::GLsizei, + info_log: *mut c_char, + ), + gl_use_program: unsafe extern "C" fn(program: gl::GLuint), + gl_get_attrib_location: + unsafe extern "C" fn(program: gl::GLuint, name: *const c_char) -> gl::GLint, + gl_get_uniform_location: + unsafe extern "C" fn(program: gl::GLuint, name: *const c_char) -> gl::GLint, + gl_uniform_matrix4fv: unsafe extern "C" fn( + location: gl::GLint, + count: gl::GLsizei, + transpose: gl::GLenum, + value: *const f32, + ), + gl_uniform1i: unsafe extern "C" fn(location: gl::GLint, v: gl::GLint), + gl_uniform4f: + unsafe extern "C" fn(location: gl::GLint, x: f32, y: f32, z: f32, w: f32), + gl_gen_textures: unsafe extern "C" fn(n: gl::GLsizei, textures: *mut gl::GLuint), + gl_bind_texture: unsafe extern "C" fn(target: gl::GLenum, texture: gl::GLuint), + gl_tex_parameteri: + unsafe extern "C" fn(target: gl::GLenum, pname: gl::GLenum, param: gl::GLint), + gl_tex_image_2d: unsafe extern "C" fn( + target: gl::GLenum, + level: gl::GLint, + internalformat: gl::GLenum, + width: gl::GLsizei, + height: gl::GLsizei, + border: gl::GLint, + format: gl::GLenum, + type_: gl::GLenum, + data: *const c_void_raw, + ), + gl_active_texture: unsafe extern "C" fn(texture: gl::GLenum), + gl_gen_buffers: unsafe extern "C" fn(n: gl::GLsizei, buffers: *mut gl::GLuint), + gl_bind_buffer: unsafe extern "C" fn(target: gl::GLenum, buffer: gl::GLuint), + gl_buffer_data: unsafe extern "C" fn( + target: gl::GLenum, + size: isize, + data: *const c_void_raw, + usage: gl::GLenum, + ), + gl_enable_vertex_attrib_array: unsafe extern "C" fn(index: gl::GLuint), + gl_vertex_attrib_pointer: unsafe extern "C" fn( + index: gl::GLuint, + size: gl::GLint, + type_: gl::GLenum, + normalized: gl::GLenum, + stride: gl::GLsizei, + pointer: *const c_void_raw, + ), + gl_draw_elements: unsafe extern "C" fn( + mode: gl::GLenum, + count: gl::GLsizei, + type_: gl::GLenum, + indices: *const c_void_raw, + ), + gl_get_error: unsafe extern "C" fn() -> gl::GLenum, + gl_delete_textures: unsafe extern "C" fn(n: gl::GLsizei, textures: *const gl::GLuint), + gl_delete_buffers: unsafe extern "C" fn(n: gl::GLsizei, buffers: *const gl::GLuint), + + // X11 + x_open_display: + unsafe extern "C" fn(name: *const c_char) -> *mut x11::Display, + x_close_display: unsafe extern "C" fn(disp: *mut x11::Display) -> c_int, + x_create_window: unsafe extern "C" fn( + disp: *mut x11::Display, + parent: x11::Window, + x: c_int, + y: c_int, + width: c_uint, + height: c_uint, + border_width: c_uint, + depth: c_int, + class: c_int, + visual: *mut c_void, + valuemask: c_long, + attributes: *mut x11::XSetWindowAttributes, + ) -> x11::Window, + x_map_window: unsafe extern "C" fn(disp: *mut x11::Display, w: x11::Window) -> c_int, + x_store_name: + unsafe extern "C" fn(disp: *mut x11::Display, w: x11::Window, name: *const c_char) -> c_int, + x_flush: unsafe extern "C" fn(disp: *mut x11::Display) -> c_int, +} + +impl Gl { + /// 加载所有动态库函数 + pub fn load() -> Result { + let lib_egl = unsafe { libloading::Library::new("libEGL.so.1")? }; + let lib_gl = unsafe { libloading::Library::new("libGLESv2.so.2")? }; + let lib_x11 = unsafe { libloading::Library::new("libX11.so.6")? }; + + unsafe { + Ok(Self { + egl_get_display: *lib_egl.get(b"eglGetDisplay\0")?, + egl_initialize: *lib_egl.get(b"eglInitialize\0")?, + egl_choose_config: *lib_egl.get(b"eglChooseConfig\0")?, + egl_create_window_surface: *lib_egl.get(b"eglCreateWindowSurface\0")?, + egl_create_context: *lib_egl.get(b"eglCreateContext\0")?, + egl_make_current: *lib_egl.get(b"eglMakeCurrent\0")?, + egl_swap_buffers: *lib_egl.get(b"eglSwapBuffers\0")?, + egl_terminate: *lib_egl.get(b"eglTerminate\0")?, + + gl_clear: *lib_gl.get(b"glClear\0")?, + gl_clear_color: *lib_gl.get(b"glClearColor\0")?, + gl_enable: *lib_gl.get(b"glEnable\0")?, + gl_disable: *lib_gl.get(b"glDisable\0")?, + gl_blend_func: *lib_gl.get(b"glBlendFunc\0")?, + gl_blend_func_separate: *lib_gl.get(b"glBlendFuncSeparate\0")?, + gl_viewport: *lib_gl.get(b"glViewport\0")?, + gl_create_shader: *lib_gl.get(b"glCreateShader\0")?, + gl_shader_source: *lib_gl.get(b"glShaderSource\0")?, + gl_compile_shader: *lib_gl.get(b"glCompileShader\0")?, + gl_get_shaderiv: *lib_gl.get(b"glGetShaderiv\0")?, + gl_get_shader_info_log: *lib_gl.get(b"glGetShaderInfoLog\0")?, + gl_create_program: *lib_gl.get(b"glCreateProgram\0")?, + gl_attach_shader: *lib_gl.get(b"glAttachShader\0")?, + gl_link_program: *lib_gl.get(b"glLinkProgram\0")?, + gl_get_programiv: *lib_gl.get(b"glGetProgramiv\0")?, + gl_get_program_info_log: *lib_gl.get(b"glGetProgramInfoLog\0")?, + gl_use_program: *lib_gl.get(b"glUseProgram\0")?, + gl_get_attrib_location: *lib_gl.get(b"glGetAttribLocation\0")?, + gl_get_uniform_location: *lib_gl.get(b"glGetUniformLocation\0")?, + gl_uniform_matrix4fv: *lib_gl.get(b"glUniformMatrix4fv\0")?, + gl_uniform1i: *lib_gl.get(b"glUniform1i\0")?, + gl_uniform4f: *lib_gl.get(b"glUniform4f\0")?, + gl_gen_textures: *lib_gl.get(b"glGenTextures\0")?, + gl_bind_texture: *lib_gl.get(b"glBindTexture\0")?, + gl_tex_parameteri: *lib_gl.get(b"glTexParameteri\0")?, + gl_tex_image_2d: *lib_gl.get(b"glTexImage2D\0")?, + gl_active_texture: *lib_gl.get(b"glActiveTexture\0")?, + gl_gen_buffers: *lib_gl.get(b"glGenBuffers\0")?, + gl_bind_buffer: *lib_gl.get(b"glBindBuffer\0")?, + gl_buffer_data: *lib_gl.get(b"glBufferData\0")?, + gl_enable_vertex_attrib_array: *lib_gl.get(b"glEnableVertexAttribArray\0")?, + gl_vertex_attrib_pointer: *lib_gl.get(b"glVertexAttribPointer\0")?, + gl_draw_elements: *lib_gl.get(b"glDrawElements\0")?, + gl_get_error: *lib_gl.get(b"glGetError\0")?, + gl_delete_textures: *lib_gl.get(b"glDeleteTextures\0")?, + gl_delete_buffers: *lib_gl.get(b"glDeleteBuffers\0")?, + + x_open_display: *lib_x11.get(b"XOpenDisplay\0")?, + x_close_display: *lib_x11.get(b"XCloseDisplay\0")?, + x_create_window: *lib_x11.get(b"XCreateWindow\0")?, + x_map_window: *lib_x11.get(b"XMapWindow\0")?, + x_store_name: *lib_x11.get(b"XStoreName\0")?, + x_flush: *lib_x11.get(b"XFlush\0")?, + + _lib_egl: lib_egl, + _lib_gl: lib_gl, + _lib_x11: lib_x11, + }) + } + } +} + +/// EGL/GLES2/X11 渲染上下文 +pub struct RenderContext { + pub gl: Gl, + display: egl::EGLDisplay, + _config: egl::EGLConfig, + context: egl::EGLContext, + surface: egl::EGLSurface, + x_display: *mut x11::Display, + x_window: x11::Window, + pub program: GLuint, + pub attrib_position: GLint, + pub attrib_tex_coord: GLint, + pub uniform_matrix: GLint, + pub uniform_texture: GLint, + pub uniform_base_color: GLint, + pub uniform_multiply_color: GLint, + pub uniform_screen_color: GLint, + pub width: i32, + pub height: i32, +} + +use gl::*; + +/// 创建并链接着色器程序 +fn compile_shader(gl: &Gl, shader_type: GLenum, src: &str) -> Result { + unsafe { + let shader = (gl.gl_create_shader)(shader_type); + if shader == 0 { + return Err(anyhow!("glCreateShader 返回 0")); + } + let src_c = std::ffi::CString::new(src)?; + let src_ptr = src_c.as_ptr(); + (gl.gl_shader_source)(shader, 1, &src_ptr, std::ptr::null()); + (gl.gl_compile_shader)(shader); + + let mut status = 0; + (gl.gl_get_shaderiv)(shader, GL_COMPILE_STATUS, &mut status); + if status == 0 { + let mut log = vec![0i8; 1024]; + (gl.gl_get_shader_info_log)( + shader, + 1024, + std::ptr::null_mut(), + log.as_mut_ptr(), + ); + let log_str = String::from_utf8_lossy( + std::slice::from_raw_parts(log.as_ptr() as *const u8, 1024), + ); + return Err(anyhow!("着色器编译失败: {}", log_str)); + } + Ok(shader) + } +} + +impl RenderContext { + /// 创建全屏 X11 窗口 + EGL 上下文 + pub fn new_fullscreen(width: i32, height: i32) -> Result { + let gl = Gl::load()?; + + // X11 窗口 + let x_display = unsafe { (gl.x_open_display)(std::ptr::null()) }; + if x_display.is_null() { + return Err(anyhow!("XOpenDisplay 失败(DISPLAY 环境变量是否设置?)")); + } + let root_window: x11::Window = 0; // DefaultRootWindow + let mut attrs = x11::XSetWindowAttributes { + background_pixmap: 0, + background_pixel: 0, + border_pixmap: 0, + border_pixel: 0, + bit_gravity: 0, + win_gravity: 0, + backing_store: 0, + backing_planes: 0, + backing_pixel: 0, + save_under: 0, + event_mask: x11::ExposureMask | x11::StructureNotifyMask, + do_not_propagate_mask: 0, + override_redirect: 1, // 全屏无装饰 + colormap: 0, + cursor: 0, + }; + let x_window = unsafe { + (gl.x_create_window)( + x_display, + root_window, + 0, + 0, + width as u32, + height as u32, + 0, + 24, // depth + 1, // InputOutput + std::ptr::null_mut(), + x11::CWOverrideRedirect | x11::CWEventMask, + &mut attrs, + ) + }; + if x_window == 0 { + return Err(anyhow!("XCreateWindow 失败")); + } + unsafe { + let title = std::ffi::CString::new("ShowenV2 Live2D")?; + (gl.x_store_name)(x_display, x_window, title.as_ptr()); + (gl.x_map_window)(x_display, x_window); + (gl.x_flush)(x_display); + } + + // EGL + let display = unsafe { (gl.egl_get_display)(egl::EGL_DEFAULT_DISPLAY_PTR()) }; + if display.is_null() { + return Err(anyhow!("eglGetDisplay 失败")); + } + let mut major = 0; + let mut minor = 0; + let ok = unsafe { (gl.egl_initialize)(display, &mut major, &mut minor) }; + if ok == 0 { + return Err(anyhow!("eglInitialize 失败")); + } + println!("[Live2D] EGL 版本: {}.{}", major, minor); + + // 选配置 + let config_attrs = [ + egl::EGL_RED_SIZE, 8, + egl::EGL_GREEN_SIZE, 8, + egl::EGL_BLUE_SIZE, 8, + egl::EGL_ALPHA_SIZE, 8, + egl::EGL_SURFACE_TYPE, egl::EGL_WINDOW_BIT, + egl::EGL_RENDERABLE_TYPE, egl::EGL_OPENGL_ES2_BIT, + egl::EGL_NONE, + ]; + let mut config: egl::EGLConfig = std::ptr::null_mut(); + let mut num_config = 0; + let ok = unsafe { + (gl.egl_choose_config)( + display, + config_attrs.as_ptr(), + &mut config, + 1, + &mut num_config, + ) + }; + if ok == 0 || num_config == 0 { + return Err(anyhow!("eglChooseConfig 失败")); + } + + // 创建 surface + let surface = unsafe { + (gl.egl_create_window_surface)( + display, + config, + x_window as egl::NativeWindowType, + std::ptr::null(), + ) + }; + if surface.is_null() { + return Err(anyhow!("eglCreateWindowSurface 失败")); + } + + // 创建 context(GLES2) + let ctx_attrs = [egl::EGL_CONTEXT_CLIENT_VERSION, 2, egl::EGL_NONE]; + let context = unsafe { + (gl.egl_create_context)(display, config, std::ptr::null(), ctx_attrs.as_ptr()) + }; + if context.is_null() { + return Err(anyhow!("eglCreateContext 失败")); + } + + // make current + let ok = unsafe { + (gl.egl_make_current)(display, surface, surface, context) + }; + if ok == 0 { + return Err(anyhow!("eglMakeCurrent 失败")); + } + + // 设置视口 + unsafe { + (gl.gl_viewport)(0, 0, width, height); + (gl.gl_clear_color)(0.0, 0.0, 0.0, 0.0); + (gl.gl_enable)(GL_BLEND); + (gl.gl_blend_func)(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + // 编译着色器 + let vert = compile_shader(&gl, GL_VERTEX_SHADER, VERT_SHADER_SRC)?; + let frag = compile_shader(&gl, GL_FRAGMENT_SHADER, FRAG_SHADER_SRC)?; + let program = unsafe { + let p = (gl.gl_create_program)(); + (gl.gl_attach_shader)(p, vert); + (gl.gl_attach_shader)(p, frag); + (gl.gl_link_program)(p); + let mut status = 0; + (gl.gl_get_programiv)(p, GL_LINK_STATUS, &mut status); + if status == 0 { + let mut log = vec![0i8; 1024]; + (gl.gl_get_program_info_log)( + p, + 1024, + std::ptr::null_mut(), + log.as_mut_ptr(), + ); + let log_str = String::from_utf8_lossy( + std::slice::from_raw_parts(log.as_ptr() as *const u8, 1024), + ); + return Err(anyhow!("着色器链接失败: {}", log_str)); + } + p + }; + + unsafe { (gl.gl_use_program)(program); } + + // 获取 attribute/uniform 位置 + let attrib_position = unsafe { + let name = std::ffi::CString::new("a_position")?; + (gl.gl_get_attrib_location)(program, name.as_ptr()) + }; + let attrib_tex_coord = unsafe { + let name = std::ffi::CString::new("a_texCoord")?; + (gl.gl_get_attrib_location)(program, name.as_ptr()) + }; + let uniform_matrix = unsafe { + let name = std::ffi::CString::new("u_matrix")?; + (gl.gl_get_uniform_location)(program, name.as_ptr()) + }; + let uniform_texture = unsafe { + let name = std::ffi::CString::new("s_texture0")?; + (gl.gl_get_uniform_location)(program, name.as_ptr()) + }; + let uniform_base_color = unsafe { + let name = std::ffi::CString::new("u_baseColor")?; + (gl.gl_get_uniform_location)(program, name.as_ptr()) + }; + let uniform_multiply_color = unsafe { + let name = std::ffi::CString::new("u_multiplyColor")?; + (gl.gl_get_uniform_location)(program, name.as_ptr()) + }; + let uniform_screen_color = unsafe { + let name = std::ffi::CString::new("u_screenColor")?; + (gl.gl_get_uniform_location)(program, name.as_ptr()) + }; + + println!( + "[Live2D] GL 程序就绪: program={} pos={} tex={} mat={} tex_u={} base={} mult={} scr={}", + program, attrib_position, attrib_tex_coord, uniform_matrix, + uniform_texture, uniform_base_color, uniform_multiply_color, uniform_screen_color + ); + + Ok(Self { + gl, + display, + _config: config, + context, + surface, + x_display, + x_window, + program, + attrib_position, + attrib_tex_coord, + uniform_matrix, + uniform_texture, + uniform_base_color, + uniform_multiply_color, + uniform_screen_color, + width, + height, + }) + } + + /// 上传纹理到 GPU + pub fn create_texture(&self, img: &super::assets::TextureImage) -> GLuint { + unsafe { + let mut tex = 0; + (self.gl.gl_gen_textures)(1, &mut tex); + (self.gl.gl_bind_texture)(GL_TEXTURE_2D, tex); + (self.gl.gl_tex_parameteri)(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR as i32); + (self.gl.gl_tex_parameteri)(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR as i32); + (self.gl.gl_tex_parameteri)(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE as i32); + (self.gl.gl_tex_parameteri)(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE as i32); + (self.gl.gl_tex_image_2d)( + GL_TEXTURE_2D, + 0, + GL_RGBA as i32, + img.width as i32, + img.height as i32, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + img.rgba.as_ptr() as *const c_void, + ); + let err = (self.gl.gl_get_error)(); + if err != GL_NO_ERROR { + eprintln!("[Live2D] glTexImage2D 错误: 0x{:x}", err); + } + tex + } + } + + /// 交换缓冲区(显示到屏幕) + pub fn swap_buffers(&self) { + unsafe { + (self.gl.gl_clear)(GL_COLOR_BUFFER_BIT); + // 注意:clear 在绘制前调用,这里 swap 只是提交 + // 实际渲染流程:clear → draw → swap + (self.gl.egl_swap_buffers)(self.display, self.surface); + } + } + + /// 清屏 + pub fn clear(&self) { + unsafe { (self.gl.gl_clear)(GL_COLOR_BUFFER_BIT); } + } +} + +impl Drop for RenderContext { + fn drop(&mut self) { + // 简单清理(EGL/X11 资源在进程退出时自动释放) + unsafe { + (self.gl.x_flush)(self.x_display); + } + } +} + +// EGL_DEFAULT_DISPLAY 常量 +impl egl { + pub fn EGL_DEFAULT_DISPLAY_PTR() -> NativeDisplayType { + std::ptr::null_mut() + } +} diff --git a/src/plugins/live2d/mod.rs b/src/plugins/live2d/mod.rs new file mode 100644 index 0000000..eda92b5 --- /dev/null +++ b/src/plugins/live2d/mod.rs @@ -0,0 +1,19 @@ +//! Live2D 原生渲染插件(Rust + Cubism Core FFI + OpenGL ES 2.0) +//! +//! 架构: +//! - `core_ffi`:FFI 绑定 Cubism Core C API(libLive2DCubismCore.so) +//! - `model`:moc3 加载、model 管理、参数/drawable 数据提取 +//! - `assets`:model3.json 解析、PNG 纹理加载 +//! - `gl`:EGL 上下文 + OpenGL ES 2.0 着色器/渲染 +//! - `animation`:参数动画(眨眼、嘴部、待机呼吸) +//! - `renderer`:整合渲染循环 + +pub mod animation; +pub mod assets; +pub mod core_ffi; +pub mod gl; +pub mod model; +pub mod renderer; + +mod plugin; +pub use plugin::Live2DPlugin; diff --git a/src/plugins/live2d/model.rs b/src/plugins/live2d/model.rs new file mode 100644 index 0000000..39a28f7 --- /dev/null +++ b/src/plugins/live2d/model.rs @@ -0,0 +1,316 @@ +//! Cubism Model 加载与管理 +//! +//! 封装 moc3 读取 → revive → model 初始化 → 参数更新 → drawable 数据提取。 + +use super::core_ffi::{ + alloc_aligned, AlignedBuffer, CubismCore, CsmVector2, CsmVector4, CSM_ALIGNOF_MOC, + CSM_ALIGNOF_MODEL, +}; +use anyhow::{anyhow, Context, Result}; +use std::path::Path; + +/// 一个 drawable 的渲染所需数据快照 +#[derive(Clone)] +pub struct DrawableSnapshot { + pub texture_index: i32, + pub draw_order: i32, + pub render_order: i32, + pub opacity: f32, + pub blend_mode: i32, + pub constant_flags: u8, + pub dynamic_flags: u8, + pub vertex_positions: Vec<[f32; 2]>, + pub vertex_uvs: Vec<[f32; 2]>, + pub indices: Vec, + pub multiply_color: [f32; 4], + pub screen_color: [f32; 4], + pub mask_counts: i32, +} + +/// Canvas 信息 +#[derive(Clone, Copy, Debug, Default)] +pub struct CanvasInfo { + pub size: [f32; 2], + pub origin: [f32; 2], + pub pixels_per_unit: f32, +} + +/// 参数信息 +pub struct ParameterInfo { + pub id: String, + pub min_value: f32, + pub max_value: f32, + pub default_value: f32, +} + +/// 活跃的 Cubism Model +pub struct CubismModel { + /// Core 句柄(保持引用防止 .so 卸载) + _core: std::sync::Arc, + /// moc3 原始数据(对齐 64) + _moc_buf: AlignedBuffer, + /// moc 指针 + moc: *mut std::ffi::c_void, + /// model 内存(对齐 16) + _model_buf: AlignedBuffer, + /// model 指针 + model: *mut std::ffi::c_void, + /// 参数数量 + pub param_count: usize, + /// 参数 ID 列表(与 Core 内部顺序一致) + pub param_ids: Vec, + /// 参数索引映射(id → index) + pub param_index: std::collections::HashMap, + /// drawable 数量 + pub drawable_count: usize, + /// canvas 信息 + pub canvas: CanvasInfo, +} + +// model 指针可跨线程发送(渲染线程独占使用) +unsafe impl Send for CubismModel {} + +impl CubismModel { + /// 从 moc3 文件加载 model + pub fn load(core: std::sync::Arc, moc3_path: &Path) -> Result { + let moc_data = std::fs::read(moc3_path) + .with_context(|| format!("读取 moc3 失败: {}", moc3_path.display()))?; + + // 分配 64 对齐内存 + let mut moc_buf = alloc_aligned(moc_data.len(), CSM_ALIGNOF_MOC)?; + unsafe { + std::ptr::copy_nonoverlapping(moc_data.as_ptr(), moc_buf.as_ptr(), moc_data.len()); + } + + // 检查一致性 + let valid = unsafe { + (core.csm_has_moc_consistency)(moc_buf.as_mut_void(), moc_data.len() as u32) + }; + if valid != 1 { + return Err(anyhow!("moc3 一致性检查失败(文件损坏或版本不支持)")); + } + + // Revive moc + let moc = unsafe { + (core.csm_revive_moc_in_place)(moc_buf.as_mut_void(), moc_data.len() as u32) + }; + if moc.is_null() { + return Err(anyhow!("csmReviveMocInPlace 返回空指针")); + } + + // 获取 model 所需大小 + let model_size = unsafe { (core.csm_get_sizeof_model)(moc) }; + if model_size == 0 { + return Err(anyhow!("csmGetSizeofModel 返回 0")); + } + + // 分配 16 对齐内存 + let mut model_buf = alloc_aligned(model_size as usize, CSM_ALIGNOF_MODEL)?; + let model = unsafe { + (core.csm_initialize_model_in_place)( + moc, + model_buf.as_mut_void(), + model_size, + ) + }; + if model.is_null() { + return Err(anyhow!("csmInitializeModelInPlace 返回空指针")); + } + + // 读取参数信息 + let param_count = unsafe { (core.csm_get_parameter_count)(model) } as usize; + let param_ids_ptr = unsafe { (core.csm_get_parameter_ids)(model) }; + let mut param_ids = Vec::with_capacity(param_count); + let mut param_index = std::collections::HashMap::new(); + for i in 0..param_count { + let id = unsafe { + super::core_ffi::cstr_ptr_to_string(*param_ids_ptr.add(i)) + .unwrap_or_default() + }; + param_index.insert(id.clone(), i); + param_ids.push(id); + } + + // 读取 drawable 数量 + let drawable_count = unsafe { (core.csm_get_drawable_count)(model) } as usize; + + // 读取 canvas 信息 + let mut size = CsmVector2::default(); + let mut origin = CsmVector2::default(); + let mut ppu = 0.0f32; + unsafe { + (core.csm_read_canvas_info)(model, &mut size, &mut origin, &mut ppu); + } + + let canvas = CanvasInfo { + size: [size.x, size.y], + origin: [origin.x, origin.y], + pixels_per_unit: ppu, + }; + + println!( + "[Live2D] 模型加载成功: 参数={} drawable={} canvas={:?}x{:.0}ppu", + param_count, drawable_count, canvas.size, canvas.pixels_per_unit + ); + + Ok(Self { + _core: core, + _moc_buf: moc_buf, + moc, + _model_buf: model_buf, + model, + param_count, + param_ids, + param_index, + drawable_count, + canvas, + }) + } + + /// 获取参数最小值 + pub fn param_min_values(&self, core: &CubismCore) -> Vec { + unsafe { + let p = (core.csm_get_parameter_minimum_values)(self.model); + std::slice::from_raw_parts(p, self.param_count).to_vec() + } + } + + /// 获取参数最大值 + pub fn param_max_values(&self, core: &CubismCore) -> Vec { + unsafe { + let p = (core.csm_get_parameter_maximum_values)(self.model); + std::slice::from_raw_parts(p, self.param_count).to_vec() + } + } + + /// 获取参数默认值 + pub fn param_default_values(&self, core: &CubismCore) -> Vec { + unsafe { + let p = (core.csm_get_parameter_default_values)(self.model); + std::slice::from_raw_parts(p, self.param_count).to_vec() + } + } + + /// 获取参数值缓冲区(可读写) + pub fn param_values_mut(&self, core: &CubismCore) -> &mut [f32] { + unsafe { + let p = (core.csm_get_parameter_values)(self.model); + std::slice::from_raw_parts_mut(p, self.param_count) + } + } + + /// 按参数 ID 设置值 + pub fn set_param(&self, core: &CubismCore, id: &str, value: f32) -> bool { + if let Some(&idx) = self.param_index.get(id) { + let slice = self.param_values_mut(core); + slice[idx] = value; + true + } else { + false + } + } + + /// 按参数 ID 获取值 + pub fn get_param(&self, core: &CubismCore, id: &str) -> Option { + let idx = *self.param_index.get(id)?; + let slice = self.param_values_mut(core); + Some(slice[idx]) + } + + /// 将所有参数重置为默认值 + pub fn reset_to_default(&self, core: &CubismCore) { + let defaults = self.param_default_values(core); + let slice = self.param_values_mut(core); + for (i, v) in defaults.into_iter().enumerate() { + slice[i] = v; + } + } + + /// 更新 model(应用参数变化,重新计算顶点/不透明度等) + pub fn update(&self, core: &CubismCore) { + unsafe { (core.csm_update_model)(self.model) }; + } + + /// 重置动态标志 + pub fn reset_dynamic_flags(&self, core: &CubismCore) { + unsafe { (core.csm_reset_drawable_dynamic_flags)(self.model) }; + } + + /// 获取所有 drawable 的渲染数据快照(按 render order 排序) + pub fn drawable_snapshots(&self, core: &CubismCore) -> Vec { + let count = self.drawable_count; + unsafe { + let render_orders = (core.csm_get_render_orders)(self.model); + let texture_indices = (core.csm_get_drawable_texture_indices)(self.model); + let draw_orders = (core.csm_get_drawable_draw_orders)(self.model); + let opacities = (core.csm_get_drawable_opacities)(self.model); + let blend_modes = (core.csm_get_drawable_blend_modes)(self.model); + let const_flags = (core.csm_get_drawable_constant_flags)(self.model); + let dyn_flags = (core.csm_get_drawable_dynamic_flags)(self.model); + let mask_counts = (core.csm_get_drawable_mask_counts)(self.model); + let vertex_counts = (core.csm_get_drawable_vertex_counts)(self.model); + let vertex_positions = (core.csm_get_drawable_vertex_positions)(self.model); + let vertex_uvs = (core.csm_get_drawable_vertex_uvs)(self.model); + let index_counts = (core.csm_get_drawable_index_counts)(self.model); + let indices = (core.csm_get_drawable_indices)(self.model); + let multiply_colors = (core.csm_get_drawable_multiply_colors)(self.model); + let screen_colors = (core.csm_get_drawable_screen_colors)(self.model); + + // 先收集每个 drawable 的原始索引 + let mut items: Vec<(usize, i32)> = (0..count) + .map(|i| (i, *render_orders.add(i))) + .collect(); + // 按 render_order 升序排列 + items.sort_by_key(|&(_, ro)| ro); + + items + .into_iter() + .map(|(i, ro)| { + let vc = *vertex_counts.add(i) as usize; + let ic = *index_counts.add(i) as usize; + let vp = *vertex_positions.add(i); + let vu = *vertex_uvs.add(i); + let idx = *indices.add(i); + + let mut verts = Vec::with_capacity(vc); + let mut uvs = Vec::with_capacity(vc); + for v in 0..vc { + let p = *vp.add(v); + let u = *vu.add(v); + verts.push([p.x, p.y]); + uvs.push([u.x, u.y]); + } + let mut idx_vec = Vec::with_capacity(ic); + for k in 0..ic { + idx_vec.push(*idx.add(k)); + } + + let mc = *multiply_colors.add(i); + let sc = *screen_colors.add(i); + + DrawableSnapshot { + texture_index: *texture_indices.add(i), + draw_order: *draw_orders.add(i), + render_order: ro, + opacity: *opacities.add(i), + blend_mode: *blend_modes.add(i), + constant_flags: *const_flags.add(i), + dynamic_flags: *dyn_flags.add(i), + vertex_positions: verts, + vertex_uvs: uvs, + indices: idx_vec, + multiply_color: [mc.x, mc.y, mc.z, mc.w], + screen_color: [sc.x, sc.y, sc.z, sc.w], + mask_counts: *mask_counts.add(i), + } + }) + .collect() + } + } +} + +impl CubismModel { + // 保留 CsmVector4 引用避免 unused + #[allow(dead_code)] + fn _ensure_v4_linked(_v: CsmVector4) {} +} diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index c87a006..eec5f94 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -2,6 +2,7 @@ pub mod ai; pub mod ble; pub mod device; pub mod http; +pub mod live2d; pub mod screen; pub mod video; pub mod wifi;