2025-12-03 22:15:22 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* Shader class for managing GLSL shaders.
|
|
|
|
|
|
* 用于管理GLSL着色器的类。
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import { ShaderDefinition, UniformValue, UniformType } from './types';
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Shader class that holds vertex and fragment shader source.
|
|
|
|
|
|
* 持有顶点和片段着色器源代码的着色器类。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export class Shader {
|
|
|
|
|
|
/** Shader ID assigned by the engine | 引擎分配的着色器ID */
|
|
|
|
|
|
private _id: number = -1;
|
|
|
|
|
|
|
|
|
|
|
|
/** Shader name for reference | 着色器名称用于引用 */
|
|
|
|
|
|
public name: string;
|
|
|
|
|
|
|
|
|
|
|
|
/** Vertex shader GLSL source | 顶点着色器GLSL源代码 */
|
|
|
|
|
|
public vertexSource: string;
|
|
|
|
|
|
|
|
|
|
|
|
/** Fragment shader GLSL source | 片段着色器GLSL源代码 */
|
|
|
|
|
|
public fragmentSource: string;
|
|
|
|
|
|
|
|
|
|
|
|
/** Shader uniforms with default values | 着色器uniform及其默认值 */
|
|
|
|
|
|
private uniforms: Map<string, UniformValue> = new Map();
|
|
|
|
|
|
|
|
|
|
|
|
/** Whether the shader has been compiled | 着色器是否已编译 */
|
|
|
|
|
|
private _compiled: boolean = false;
|
|
|
|
|
|
|
|
|
|
|
|
constructor(name: string, vertexSource: string, fragmentSource: string) {
|
|
|
|
|
|
this.name = name;
|
|
|
|
|
|
this.vertexSource = vertexSource;
|
|
|
|
|
|
this.fragmentSource = fragmentSource;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Get the shader ID | 获取着色器ID */
|
|
|
|
|
|
get id(): number {
|
|
|
|
|
|
return this._id;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Set the shader ID (called by ShaderManager) | 设置着色器ID(由ShaderManager调用) */
|
|
|
|
|
|
set id(value: number) {
|
|
|
|
|
|
this._id = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Check if shader is compiled | 检查着色器是否已编译 */
|
|
|
|
|
|
get compiled(): boolean {
|
|
|
|
|
|
return this._compiled;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** Mark shader as compiled | 标记着色器为已编译 */
|
|
|
|
|
|
markCompiled(): void {
|
|
|
|
|
|
this._compiled = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Define a uniform with default value.
|
|
|
|
|
|
* 定义带有默认值的uniform。
|
|
|
|
|
|
*/
|
|
|
|
|
|
defineUniform(name: string, type: UniformType, defaultValue: number | number[] | string): this {
|
|
|
|
|
|
this.uniforms.set(name, { type, value: defaultValue });
|
|
|
|
|
|
return this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get uniform definition.
|
|
|
|
|
|
* 获取uniform定义。
|
|
|
|
|
|
*/
|
|
|
|
|
|
getUniform(name: string): UniformValue | undefined {
|
|
|
|
|
|
return this.uniforms.get(name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get all uniform definitions.
|
|
|
|
|
|
* 获取所有uniform定义。
|
|
|
|
|
|
*/
|
|
|
|
|
|
getUniforms(): Map<string, UniformValue> {
|
|
|
|
|
|
return this.uniforms;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Export to shader definition.
|
|
|
|
|
|
* 导出为着色器定义。
|
|
|
|
|
|
*/
|
|
|
|
|
|
toDefinition(): ShaderDefinition {
|
|
|
|
|
|
const uniformsObj: Record<string, UniformValue> = {};
|
|
|
|
|
|
for (const [key, value] of this.uniforms) {
|
|
|
|
|
|
uniformsObj[key] = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
name: this.name,
|
|
|
|
|
|
vertexSource: this.vertexSource,
|
|
|
|
|
|
fragmentSource: this.fragmentSource,
|
|
|
|
|
|
uniforms: Object.keys(uniformsObj).length > 0 ? uniformsObj : undefined
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Import from shader definition.
|
|
|
|
|
|
* 从着色器定义导入。
|
|
|
|
|
|
*/
|
|
|
|
|
|
static fromDefinition(def: ShaderDefinition): Shader {
|
|
|
|
|
|
const shader = new Shader(def.name, def.vertexSource, def.fragmentSource);
|
|
|
|
|
|
|
|
|
|
|
|
if (def.uniforms) {
|
|
|
|
|
|
for (const [key, value] of Object.entries(def.uniforms)) {
|
|
|
|
|
|
shader.uniforms.set(key, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return shader;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============= Built-in Shaders =============
|
|
|
|
|
|
// ============= 内置着色器 =============
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Default sprite vertex shader source.
|
|
|
|
|
|
* 默认精灵顶点着色器源代码。
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
*
|
|
|
|
|
|
* Vertex layout (9 floats per vertex):
|
|
|
|
|
|
* 顶点布局(每顶点 9 个浮点数):
|
|
|
|
|
|
* - location 0: position (2 floats)
|
|
|
|
|
|
* - location 1: tex_coord (2 floats)
|
|
|
|
|
|
* - location 2: color (4 floats)
|
|
|
|
|
|
* - location 3: aspect_ratio (1 float)
|
2025-12-03 22:15:22 +08:00
|
|
|
|
*/
|
|
|
|
|
|
export const DEFAULT_VERTEX_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
// Vertex attributes | 顶点属性
|
|
|
|
|
|
layout(location = 0) in vec2 a_position;
|
|
|
|
|
|
layout(location = 1) in vec2 a_texCoord;
|
|
|
|
|
|
layout(location = 2) in vec4 a_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
layout(location = 3) in float a_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
// Uniforms | 统一变量
|
|
|
|
|
|
uniform mat3 u_projection;
|
|
|
|
|
|
|
|
|
|
|
|
// Outputs to fragment shader | 输出到片段着色器
|
|
|
|
|
|
out vec2 v_texCoord;
|
|
|
|
|
|
out vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
out float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
// Apply projection matrix | 应用投影矩阵
|
|
|
|
|
|
vec3 pos = u_projection * vec3(a_position, 1.0);
|
|
|
|
|
|
gl_Position = vec4(pos.xy, 0.0, 1.0);
|
|
|
|
|
|
|
|
|
|
|
|
// Pass through to fragment shader | 传递到片段着色器
|
|
|
|
|
|
v_texCoord = a_texCoord;
|
|
|
|
|
|
v_color = a_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
v_aspectRatio = a_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Default sprite fragment shader source.
|
|
|
|
|
|
* 默认精灵片段着色器源代码。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const DEFAULT_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
// Inputs from vertex shader | 来自顶点着色器的输入
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
in float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
// Texture sampler | 纹理采样器
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
|
|
|
|
|
|
// Output color | 输出颜色
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
// Sample texture and multiply by vertex color | 采样纹理并乘以顶点颜色
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
fragColor = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
// Discard fully transparent pixels | 丢弃完全透明的像素
|
|
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Grayscale fragment shader for desaturation effect.
|
|
|
|
|
|
* 灰度片段着色器用于去饱和效果。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const GRAYSCALE_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
in float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
uniform float u_grayscale; // 0.0 = full color, 1.0 = full grayscale
|
|
|
|
|
|
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
vec4 color = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));
|
|
|
|
|
|
vec3 grayscaleColor = vec3(gray);
|
|
|
|
|
|
|
|
|
|
|
|
fragColor = vec4(mix(color.rgb, grayscaleColor, u_grayscale), color.a);
|
|
|
|
|
|
|
|
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Color tint fragment shader.
|
|
|
|
|
|
* 颜色着色片段着色器。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const TINT_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
in float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
uniform vec4 u_tintColor; // Tint color to apply
|
|
|
|
|
|
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
vec4 color = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
// Apply tint by multiplying RGB and keeping alpha
|
|
|
|
|
|
fragColor = vec4(color.rgb * u_tintColor.rgb, color.a * u_tintColor.a);
|
|
|
|
|
|
|
|
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Flash/hit effect fragment shader.
|
|
|
|
|
|
* 闪白/受击效果片段着色器。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const FLASH_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
in float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
uniform vec4 u_flashColor; // Flash color
|
|
|
|
|
|
uniform float u_flashAmount; // 0.0 = no flash, 1.0 = full flash
|
|
|
|
|
|
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
vec4 color = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
// Mix original color with flash color
|
|
|
|
|
|
vec3 flashedColor = mix(color.rgb, u_flashColor.rgb, u_flashAmount);
|
|
|
|
|
|
fragColor = vec4(flashedColor, color.a);
|
|
|
|
|
|
|
|
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Outline fragment shader.
|
|
|
|
|
|
* 描边片段着色器。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const OUTLINE_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
in float v_aspectRatio;
|
2025-12-03 22:15:22 +08:00
|
|
|
|
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
uniform vec4 u_outlineColor;
|
|
|
|
|
|
uniform float u_outlineWidth;
|
|
|
|
|
|
uniform vec2 u_texelSize; // 1.0 / textureSize
|
|
|
|
|
|
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
vec4 color = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
// Check if this pixel should be outline
|
|
|
|
|
|
if (color.a < 0.1) {
|
|
|
|
|
|
// Sample neighbors
|
|
|
|
|
|
float a = 0.0;
|
|
|
|
|
|
for (float x = -1.0; x <= 1.0; x += 1.0) {
|
|
|
|
|
|
for (float y = -1.0; y <= 1.0; y += 1.0) {
|
|
|
|
|
|
vec2 offset = vec2(x, y) * u_texelSize * u_outlineWidth;
|
|
|
|
|
|
a += texture(u_texture, v_texCoord + offset).a;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (a > 0.0) {
|
|
|
|
|
|
fragColor = u_outlineColor;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fragColor = color;
|
|
|
|
|
|
|
|
|
|
|
|
if (fragColor.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|
refactor(ui): UI 系统架构重构 (#309)
* feat(ui): 动态图集系统与渲染调试增强
## 核心功能
### 动态图集系统 (Dynamic Atlas)
- 新增 DynamicAtlasManager:运行时纹理打包,支持 MaxRects 算法
- 新增 DynamicAtlasService:自动纹理加载与图集管理
- 新增 BinPacker:高效矩形打包算法
- 支持动态/固定两种扩展策略
- 自动 UV 重映射,实现 UI 元素合批渲染
### Frame Debugger 增强
- 新增合批分析面板,显示批次中断原因
- 新增 UI 元素层级信息(depth, worldOrderInLayer)
- 新增实体高亮功能,点击可在场景中定位
- 新增动态图集可视化面板
- 改进渲染原语详情展示
### 闪光效果 (Shiny Effect)
- 新增 UIShinyEffectComponent:UI 闪光参数配置
- 新增 UIShinyEffectSystem:材质覆盖驱动的闪光动画
- 新增 ShinyEffectComponent/System(Sprite 版本)
## 引擎层改进
### Rust 纹理管理扩展
- create_blank_texture:创建空白 GPU 纹理
- update_texture_region:局部纹理更新
- 支持动态图集的 GPU 端操作
### 材质系统
- 新增 effects/ 目录:ShinyEffect 等效果实现
- 新增 interfaces/ 目录:IMaterial 等接口定义
- 新增 mixins/ 目录:可组合的材质功能
### EngineBridge 扩展
- 新增 createBlankTexture/updateTextureRegion 方法
- 改进纹理加载回调机制
## UI 渲染改进
- UIRenderCollector:支持合批调试信息
- 稳定排序:addIndex 保证渲染顺序一致性
- 九宫格渲染优化
- 材质覆盖支持
## 其他改进
- 国际化:新增 Frame Debugger 相关翻译
- 编辑器:新增渲染调试入口
- 文档:新增架构设计文档目录
* refactor(ui): 引入新基础组件架构与渲染工具函数
Phase 1 重构 - 组件职责分离与代码复用:
新增基础组件层:
- UIGraphicComponent: 所有可视 UI 元素的基类(颜色、透明度、raycast)
- UIImageComponent: 纹理显示组件(支持简单、切片、平铺、填充模式)
- UISelectableComponent: 可交互元素的基类(状态管理、颜色过渡)
新增渲染工具:
- UIRenderUtils: 提取共享的坐标计算、边框渲染、阴影渲染等工具函数
- getUIRenderTransform: 统一的变换数据提取
- renderBorder/renderShadow: 复用的边框和阴影渲染逻辑
新增渲染系统:
- UIGraphicRenderSystem: 处理新基础组件的统一渲染器
重构现有系统:
- UIRectRenderSystem: 使用新工具函数,移除重复代码
- UIButtonRenderSystem: 使用新工具函数,移除重复代码
这些改动为后续统一渲染系统奠定基础。
* refactor(ui): UIProgressBarRenderSystem 使用渲染工具函数
- 使用 getUIRenderTransform 替代手动变换计算
- 使用 renderBorder 工具函数替代重复的边框渲染
- 使用 lerpColor 工具函数替代重复的颜色插值
- 简化方法签名,使用 UIRenderTransform 类型
- 移除约 135 行重复代码
* refactor(ui): Slider 和 ScrollView 渲染系统使用工具函数
- UISliderRenderSystem: 使用 getUIRenderTransform,简化方法签名
- UIScrollViewRenderSystem: 使用 getUIRenderTransform,简化方法签名
- 统一使用 UIRenderTransform 类型减少参数传递
- 消除重复的变换计算代码
* refactor(ui): 使用 UIWidgetMarker 消除硬编码组件依赖
- 新增 UIWidgetMarker 标记组件
- UIRectRenderSystem 改为检查标记而非硬编码4种组件类型
- 各 Widget 渲染系统自动添加标记组件
- 减少模块间耦合,提高可扩展性
* feat(ui): 实现 Canvas 隔离机制
- 新增 UICanvasComponent 定义 Canvas 渲染组
- UITransformComponent 添加 Canvas 相关字段:canvasEntityId, worldSortingLayer, pixelPerfect
- UILayoutSystem 传播 Canvas 设置给子元素
- UIRenderUtils 使用 Canvas 继承的排序层
- 支持嵌套 Canvas 和不同渲染模式
* refactor(ui): 统一纹理管理工具函数
Phase 4: 纹理管理统一
新增:
- UITextureUtils.ts: 统一的纹理描述符接口和验证函数
- UITextureDescriptor: 支持 GUID/textureId/path 多种纹理源
- isValidTextureGuid: GUID 验证
- getTextureKey: 获取用于合批的纹理键
- normalizeTextureDescriptor: 规范化各种输入格式
- utils/index.ts: 工具函数导出
修改:
- UIGraphicRenderSystem: 使用新的纹理工具函数
- index.ts: 导出纹理工具类型和函数
* refactor(ui): 实现统一的脏标记机制
Phase 5: Dirty 标记机制
新增:
- UIDirtyFlags.ts: 位标记枚举和追踪工具
- UIDirtyFlags: Visual/Layout/Transform/Material/Text 标记
- IDirtyTrackable: 脏追踪接口
- DirtyTracker: 辅助工具类
- 帧级别脏状态追踪 (markFrameDirty, isFrameDirty)
修改:
- UIGraphicComponent: 实现 IDirtyTrackable
- 属性 setter 自动设置脏标记
- 保留 setDirty/clearDirty 向后兼容
- UIImageComponent: 所有属性支持脏追踪
- textureGuid/imageType/fillAmount 等变化自动标记
- UIGraphicRenderSystem: 使用 clearDirtyFlags()
导出:
- UIDirtyFlags, IDirtyTrackable, DirtyTracker
- markFrameDirty, isFrameDirty, clearFrameDirty
* refactor(ui): 移除过时的 dirty flag API
移除 UIGraphicComponent 中的兼容性 API:
- 移除 _isDirty getter/setter
- 移除 setDirty() 方法
- 移除 clearDirty() 方法
现在统一使用新的 dirty flag 系统:
- isDirty() / hasDirtyFlag(flags)
- markDirty(flags) / clearDirtyFlags()
* fix(ui): 修复两个 TODO 功能
1. 滑块手柄命中测试 (UIInputSystem)
- UISliderComponent 添加 getHandleBounds() 计算手柄边界
- UISliderComponent 添加 isPointInHandle() 精确命中测试
- UIInputSystem.handleSlider() 使用精确测试更新悬停状态
2. 径向填充渲染 (UIGraphicRenderSystem)
- 实现 renderRadialFill() 方法
- 支持 radial90/radial180/radial360 三种模式
- 支持 fillOrigin (top/right/bottom/left) 和 fillClockwise
- 使用多段矩形近似饼形填充效果
* feat(ui): 完善 UI 系统架构和九宫格渲染
* fix(ui): 修复文本渲染层级问题并清理调试代码
- 修复纹理就绪后调用 invalidateUIRenderCaches() 导致的无限循环
- 移除 UITextRenderSystem、UIButtonRenderSystem、UIRectRenderSystem 中的首帧调试输出
- 移除 UILayoutSystem 中的布局调试日志
- 清理所有 __UI_RENDER_DEBUG__ 条件日志
* refactor(ui): 优化渲染批处理和输入框组件
渲染系统:
- 修复 RenderBatcher 保持渲染顺序
- 优化 Rust SpriteBatch 避免合并非连续精灵
- 增强 EngineRenderSystem 纹理就绪检测
输入框组件:
- 增强 UIInputFieldComponent 功能
- 改进 UIInputSystem 输入处理
- 新增 TextMeasureService 文本测量服务
* fix(ui): 修复九宫格首帧渲染和InputField输入问题
- 修复九宫格首帧 size=0x0 问题:
- Viewport.tsx: 预览模式读取图片尺寸存储到 importSettings
- AssetDatabase: ISpriteSettings 添加 width/height 字段
- AssetMetadataService: getTextureSpriteInfo 使用元数据尺寸作为后备
- UIRectRenderSystem: 当 atlasEntry 不存在时使用 spriteInfo 尺寸
- WebBuildPipeline: 构建时包含 importSettings
- AssetManager: 从 catalog 初始化时复制 importSettings
- AssetTypes: IAssetCatalogEntry 添加 importSettings 字段
- 修复 InputField 无法输入问题:
- UIRuntimeModule: manifest 添加 pluginExport: 'UIPlugin'
- 确保预览模式正确加载 UI 插件并绑定 UIInputSystem
- 添加调试日志用于排查纹理加载问题
* fix(sprite): 修复类型导出错误
MaterialPropertyOverride 和 MaterialOverrides 应从 @esengine/material-system 导出
* fix(ui-editor): 补充 AnchorPreset 拉伸预设的映射
添加 StretchTop, StretchMiddle, StretchBottom, StretchLeft, StretchCenter, StretchRight 的位置和锚点值映射
2025-12-19 15:33:36 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Shiny/Shimmer effect fragment shader.
|
|
|
|
|
|
* 闪光效果片段着色器。
|
|
|
|
|
|
*
|
|
|
|
|
|
* Uses v_aspectRatio from vertex attribute for aspect-ratio-aware rotation.
|
|
|
|
|
|
* 使用顶点属性中的 v_aspectRatio 进行宽高比感知的旋转。
|
|
|
|
|
|
*/
|
|
|
|
|
|
export const SHINY_FRAGMENT_SHADER = `#version 300 es
|
|
|
|
|
|
precision highp float;
|
|
|
|
|
|
|
|
|
|
|
|
in vec2 v_texCoord;
|
|
|
|
|
|
in vec4 v_color;
|
|
|
|
|
|
in float v_aspectRatio;
|
|
|
|
|
|
|
|
|
|
|
|
uniform sampler2D u_texture;
|
|
|
|
|
|
|
|
|
|
|
|
// Shiny effect uniforms | 闪光效果 uniform 变量
|
|
|
|
|
|
uniform float u_shinyProgress; // Animation progress (0-1) | 动画进度
|
|
|
|
|
|
uniform float u_shinyWidth; // Width of shine band (0-1) | 闪光带宽度
|
|
|
|
|
|
uniform float u_shinyRotation; // Rotation in radians | 旋转角度(弧度)
|
|
|
|
|
|
uniform float u_shinySoftness; // Edge softness (0-1) | 边缘柔和度
|
|
|
|
|
|
uniform float u_shinyBrightness; // Brightness multiplier | 亮度倍数
|
|
|
|
|
|
uniform float u_shinyGloss; // Gloss intensity (0=white, 1=color-tinted) | 光泽度
|
|
|
|
|
|
|
|
|
|
|
|
out vec4 fragColor;
|
|
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
|
vec4 texColor = texture(u_texture, v_texCoord);
|
|
|
|
|
|
float originAlpha = texColor.a;
|
|
|
|
|
|
vec4 color = texColor * v_color;
|
|
|
|
|
|
|
|
|
|
|
|
// Early discard for transparent pixels
|
|
|
|
|
|
if (color.a < 0.01) {
|
|
|
|
|
|
discard;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Calculate rotated position for the sweep (0 to 1 range)
|
|
|
|
|
|
// 计算旋转后的扫描位置(0 到 1 范围)
|
|
|
|
|
|
//
|
|
|
|
|
|
// 1. 计算基础方向向量 dir = (cos(θ), sin(θ))
|
|
|
|
|
|
// 2. 宽高比校正:dir.x *= height/width = 1/aspectRatio
|
|
|
|
|
|
// 3. 归一化方向向量
|
|
|
|
|
|
// 4. 计算扫描位置(考虑纹理坐标 Y 轴方向)
|
|
|
|
|
|
//
|
|
|
|
|
|
// 1. Calculate base direction vector dir = (cos(θ), sin(θ))
|
|
|
|
|
|
// 2. Aspect ratio correction: dir.x *= height/width = 1/aspectRatio
|
|
|
|
|
|
// 3. Normalize direction vector
|
|
|
|
|
|
// 4. Calculate sweep position (accounting for texture Y-axis direction)
|
|
|
|
|
|
//
|
|
|
|
|
|
vec2 center = v_texCoord - vec2(0.5);
|
|
|
|
|
|
float cosR = cos(u_shinyRotation);
|
|
|
|
|
|
float sinR = sin(u_shinyRotation);
|
|
|
|
|
|
|
|
|
|
|
|
// Aspect ratio correction: scale X by 1/aspectRatio (height/width)
|
|
|
|
|
|
// v_aspectRatio is passed from vertex attribute, calculated at render time
|
|
|
|
|
|
// 宽高比校正:X 分量乘以 1/aspectRatio(即 height/width)
|
|
|
|
|
|
// v_aspectRatio 从顶点属性传入,在渲染时计算
|
|
|
|
|
|
float adjCosR = cosR / max(v_aspectRatio, 0.001);
|
|
|
|
|
|
|
|
|
|
|
|
// Normalize the direction vector
|
|
|
|
|
|
// 归一化方向向量
|
|
|
|
|
|
float len = sqrt(adjCosR * adjCosR + sinR * sinR);
|
|
|
|
|
|
float dirX = adjCosR / len;
|
|
|
|
|
|
float dirY = sinR / len;
|
|
|
|
|
|
|
|
|
|
|
|
// Sweep position: project onto perpendicular direction
|
|
|
|
|
|
// Y-axis flip: texture coords have Y pointing up, but we want top-to-bottom sweep
|
|
|
|
|
|
// 扫描位置:投影到垂直方向
|
|
|
|
|
|
// Y 轴翻转:纹理坐标 Y 向上,但我们需要从上到下扫描
|
|
|
|
|
|
float rotatedPos = (center.x * dirY - center.y * dirX) + 0.5;
|
|
|
|
|
|
|
|
|
|
|
|
// Map progress to location (-0.5 to 1.5 range for smooth entry/exit)
|
|
|
|
|
|
float location = u_shinyProgress * 2.0 - 0.5;
|
|
|
|
|
|
|
|
|
|
|
|
// Calculate normalized distance (1 at center, 0 at edges)
|
|
|
|
|
|
// 计算归一化距离(中心为1,边缘为0)
|
|
|
|
|
|
float normalized = 1.0 - clamp(abs((rotatedPos - location) / max(u_shinyWidth, 0.001)), 0.0, 1.0);
|
|
|
|
|
|
|
|
|
|
|
|
// Apply softness with smoothstep
|
|
|
|
|
|
// 使用 smoothstep 应用柔和度
|
|
|
|
|
|
float shinePower = smoothstep(0.0, u_shinySoftness * 2.0, normalized);
|
|
|
|
|
|
|
|
|
|
|
|
// Calculate reflect color: lerp between white and bright original color
|
|
|
|
|
|
// 计算反射颜色:在白色和明亮的原色之间插值
|
|
|
|
|
|
vec3 reflectColor = mix(vec3(1.0), color.rgb * 10.0, u_shinyGloss);
|
|
|
|
|
|
|
|
|
|
|
|
// Apply shine: additive blend with halved intensity
|
|
|
|
|
|
// 应用高光:半强度加性混合
|
|
|
|
|
|
vec3 shineAdd = originAlpha * (shinePower * 0.5) * u_shinyBrightness * reflectColor;
|
|
|
|
|
|
vec3 finalColor = color.rgb + shineAdd;
|
|
|
|
|
|
|
|
|
|
|
|
fragColor = vec4(finalColor, color.a);
|
|
|
|
|
|
}
|
|
|
|
|
|
`;
|