docs: @motajs/render-core

This commit is contained in:
unanmed 2025-03-22 17:20:36 +08:00
parent c94cb97c2c
commit 1294c5f1ca
16 changed files with 2571 additions and 27 deletions

View File

@ -75,7 +75,7 @@ export default defineConfig({
text: '@motajs/client', text: '@motajs/client',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-client/' } { text: '主页', link: '/api/motajs-client/' }
] ]
}, },
{ {
@ -83,7 +83,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-client-base/' link: '/api/motajs-client-base/'
}, },
{ {
@ -96,7 +96,7 @@ export default defineConfig({
text: '@motajs/common', text: '@motajs/common',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-common/' }, { text: '主页', link: '/api/motajs-common/' },
{ {
text: '函数', text: '函数',
link: '/api/motajs-common/functions' link: '/api/motajs-common/functions'
@ -112,7 +112,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-legacy-client/' link: '/api/motajs-legacy-client/'
} }
] ]
@ -122,7 +122,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-legacy-common/' link: '/api/motajs-legacy-common/'
} }
] ]
@ -132,7 +132,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-legacy-system/' link: '/api/motajs-legacy-system/'
} }
] ]
@ -141,14 +141,14 @@ export default defineConfig({
text: '@motajs/legacy-ui', text: '@motajs/legacy-ui',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-legacy-ui/' } { text: '主页', link: '/api/motajs-legacy-ui/' }
] ]
}, },
{ {
text: '@motajs/render', text: '@motajs/render',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-render/' } { text: '主页', link: '/api/motajs-render/' }
] ]
}, },
{ {
@ -156,8 +156,64 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-render-core/' link: '/api/motajs-render-core/'
},
{
text: '函数',
link: '/api/motajs-render-core/functions'
},
{
text: '交互事件',
link: '/api/motajs-render-core/Event'
},
{
text: 'MotaOffscreenCanvas2D',
link: '/api/motajs-render-core/MotaOffscreenCanvas2D'
},
{
text: 'Transform',
link: '/api/motajs-render-core/Transform'
},
{
text: 'RenderItem',
link: '/api/motajs-render-core/RenderItem'
},
{
text: 'Container',
link: '/api/motajs-render-core/Container'
},
{
text: 'ContainerCustom',
link: '/api/motajs-render-core/ContainerCustom'
},
{
text: 'Sprite',
link: '/api/motajs-render-core/Sprite'
},
{
text: 'MotaRenderer',
link: '/api/motajs-render-core/MotaRenderer'
},
{
text: 'GL2',
link: '/api/motajs-render-core/GL2'
},
{
text: 'GL2Program',
link: '/api/motajs-render-core/GL2Program'
},
{
text: 'RenderAdapter',
link: '/api/motajs-render-core/RenderAdapter'
},
{
text: 'Shader',
link: '/api/motajs-render-core/Shader'
},
{
text: 'ShaderProgram',
link: '/api/motajs-render-core/ShaderProgram'
} }
] ]
}, },
@ -166,7 +222,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-render-elements/' link: '/api/motajs-render-elements/'
} }
] ]
@ -176,7 +232,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-render-style/' link: '/api/motajs-render-style/'
} }
] ]
@ -186,7 +242,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-render-vue/' link: '/api/motajs-render-vue/'
} }
] ]
@ -195,7 +251,7 @@ export default defineConfig({
text: '@motajs/system', text: '@motajs/system',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-system/' } { text: '主页', link: '/api/motajs-system/' }
] ]
}, },
{ {
@ -203,7 +259,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/motajs-system-action/' link: '/api/motajs-system-action/'
} }
] ]
@ -212,14 +268,14 @@ export default defineConfig({
text: '@motajs/system-ui', text: '@motajs/system-ui',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-system-ui/' } { text: '主页', link: '/api/motajs-system-ui/' }
] ]
}, },
{ {
text: '@motajs/types', text: '@motajs/types',
collapsed: true, collapsed: true,
items: [ items: [
{ text: '目录', link: '/api/motajs-types/' } { text: '主页', link: '/api/motajs-types/' }
] ]
}, },
{ {
@ -227,7 +283,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-client-modules/' link: '/api/user-client-modules/'
} }
] ]
@ -237,7 +293,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-data-base/' link: '/api/user-data-base/'
} }
] ]
@ -247,7 +303,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-data-fallback/' link: '/api/user-data-fallback/'
} }
] ]
@ -257,7 +313,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-data-state/' link: '/api/user-data-state/'
} }
] ]
@ -267,7 +323,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-data-utils/' link: '/api/user-data-utils/'
} }
] ]
@ -277,7 +333,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-entry-client/' link: '/api/user-entry-client/'
} }
] ]
@ -287,7 +343,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-entry-data/' link: '/api/user-entry-data/'
} }
] ]
@ -297,7 +353,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-legacy-plugin-client/' link: '/api/user-legacy-plugin-client/'
} }
] ]
@ -307,7 +363,7 @@ export default defineConfig({
collapsed: true, collapsed: true,
items: [ items: [
{ {
text: '目录', text: '主页',
link: '/api/user-legacy-plugin-data/' link: '/api/user-legacy-plugin-data/'
} }
] ]

View File

@ -0,0 +1,118 @@
# Container 类 API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
Container --> RenderItem --> EventEmitter
```
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ---------------- | -------------- | ------ | ------------------------------ |
| `sortedChildren` | `RenderItem[]` | `[]` | 按 `zIndex` 排序后的子元素列表 |
---
## 构造方法
### `constructor`
**参数**
- `type`: 渲染模式(`absolute` 绝对定位 / `static` 跟随摄像机)
- `cache`: 是否启用渲染缓存
- `fall`: 是否启用变换矩阵下穿机制
**示例**
```typescript
const container = new Container('static');
```
---
## 方法说明
### `appendChild`
```typescript
function appendChild(...children: RenderItem[]): void;
```
**描述**
添加子元素并触发重新排序。
**示例**
```typescript
const child = new RenderItem('static');
container.appendChild(child); // 添加子元素
```
---
### `removeChild`
```typescript
function removeChild(...child: RenderItem[]): void;
```
**描述**
移除指定子元素并触发重新排序。
**示例**
```typescript
container.removeChild(child); // 移除子元素
```
---
### `requestSort`
```typescript
function requestSort(): void;
```
**描述**
标记需要重新排序子元素(在下一帧前自动执行)。
---
### `forEachChild`
```typescript
function forEachChild(fn: (ele: RenderItem) => void): void;
```
**描述**
遍历元素的每一个子元素DFS 遍历),并对每一个元素执行函数。
---
## 总使用示例
```typescript
// 创建基础容器
const baseContainer = new Container('absolute');
baseContainer.size(800, 600);
// 添加子元素
const sprite1 = new Sprite('static');
sprite1.pos(100, 100).setZIndex(2);
baseContainer.appendChild(sprite1);
const sprite2 = new Sprite('static');
sprite2.pos(200, 200).setZIndex(1);
baseContainer.appendChild(sprite2);
// 将容器添加到根元素
rootElement.appendChild(baseContainer);
// 动态修改子元素层级
sprite1.setZIndex(0); // 自动触发重新排序
```

View File

@ -0,0 +1,67 @@
# ContainerCustom 类 API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
ContainerCustom --> Container --> RenderItem --> EventEmitter
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ---------- | ------------------------- | ----------- | ---------------------- |
| `renderFn` | `CustomContainerRenderFn` | `undefined` | 自定义渲染函数(可选) |
---
## 构造方法
继承自 `Container`,参数与父类一致。
---
## 方法说明
### `setRenderFn`
```typescript
function setRenderFn(render?: CustomContainerRenderFn): void;
```
**描述**
设置自定义渲染函数,覆盖默认的子元素渲染逻辑。
**参数**
- `render`: 接收画布、子元素列表和变换矩阵的回调函数
**示例**
```typescript
customContainer.setRenderFn((canvas, children, transform) => {
children.forEach(child => {
child.renderContent(canvas, transform);
});
});
```
---
## 总使用示例
```ts
// 创建自定义容器
const customContainer = new ContainerCustom('static');
customContainer.setRenderFn((canvas, children) => {
// 倒序渲染子元素
children.reverse().forEach(child => {
child.renderContent(canvas, Transform.identity);
});
});
```

View File

@ -0,0 +1,201 @@
# Event 模块 API 文档
以下内容由 `DeepSeek R1` 模型生成并微调。
---
## 枚举说明
### MouseType
| 值 | 说明 |
| --------- | ---------------- |
| `None` | 没有按键按下 |
| `Left` | 左键 |
| `Middle` | 中键(按下滚轮) |
| `Right` | 右键 |
| `Back` | 侧键后退 |
| `Forward` | 侧键前进 |
### WheelType
| 值 | 说明 |
| ------- | -------------------------- |
| `None` | 无单位 |
| `Pixel` | 以像素为单位 |
| `Line` | 以行为单位(约 1rem |
| `Page` | 以页为单位(一个屏幕高度) |
### ActionType
| 值 | 说明 |
| ------- | -------------------------------- |
| `Click` | 点击事件(按下与抬起在同一元素) |
| `Down` | 鼠标或手指按下事件 |
| `Move` | 鼠标或手指移动事件 |
| `Up` | 鼠标或手指抬起事件 |
| `Enter` | 进入元素时触发 |
| `Leave` | 离开元素时触发 |
| `Wheel` | 滚轮事件 |
### EventProgress
| 值 | 说明 |
| --------- | -------- |
| `Capture` | 捕获阶段 |
| `Bubble` | 冒泡阶段 |
---
## 接口说明
### IActionEventBase
| 属性名 | 类型 | 说明 |
| ---------- | ------------ | ----------------------------------------------------------------- |
| `target` | `RenderItem` | 触发事件的元素 |
| `touch` | `boolean` | 是否为触摸操作(`true` 表示触摸,`false` 表示鼠标) |
| `type` | `MouseType` | 触发事件的按键类型(参考 `MouseType` |
| `buttons` | `number` | 当前按下的按键(通过位运算判断,例如 `buttons & MouseType.Left` |
| `altKey` | `boolean` | 是否按下 `Alt` 键 |
| `shiftKey` | `boolean` | 是否按下 `Shift` 键 |
| `ctrlKey` | `boolean` | 是否按下 `Ctrl` 键 |
| `metaKey` | `boolean` | 是否按下 `Windows/Command` 键 |
---
### IActionEvent
#### 继承关系
```mermaid
graph LR
IActionEvent --> IActionEventBase
```
| 属性名 | 类型 | 说明 |
| ------------ | -------- | -------------------------------------------- |
| `identifier` | `number` | 操作的唯一标识符(在按下、移动、抬起中一致) |
| `offsetX` | `number` | 相对于元素左上角的横坐标 |
| `offsetY` | `number` | 相对于元素左上角的纵坐标 |
| `absoluteX` | `number` | 相对于整个画布左上角的横坐标 |
| `absoluteY` | `number` | 相对于整个画布左上角的纵坐标 |
#### 方法说明
##### `stopPropagation`
```typescript
function stopPropagation(): void;
```
**描述**
停止事件的传播(捕获或冒泡阶段)。
**示例**
```typescript
item.on('click', ev => {
ev.stopPropagation(); // 阻止事件继续传播
});
```
---
### IWheelEvent
```mermaid
graph LR
IWheelEvent --> IActionEvent --> IActionEventBase
```
| 属性名 | 类型 | 说明 |
| ----------- | ----------- | -------------------- |
| `wheelX` | `number` | 横向滚动量 |
| `wheelY` | `number` | 纵向滚动量 |
| `wheelZ` | `number` | 垂直屏幕方向的滚动量 |
| `wheelType` | `WheelType` | 滚动量的单位类型 |
---
### ERenderItemActionEvent
描述了所有的交互事件类型。
| 事件名 | 参数类型 | 说明 |
| -------------- | ---------------------------- | ------------------ |
| `clickCapture` | `Readonly<IActionEvent>` | 点击事件的捕获阶段 |
| `click` | `Readonly<IActionEvent>` | 点击事件的冒泡阶段 |
| `downCapture` | `Readonly<IActionEvent>` | 按下事件的捕获阶段 |
| `down` | `Readonly<IActionEvent>` | 按下事件的冒泡阶段 |
| `moveCapture` | `Readonly<IActionEvent>` | 移动事件的捕获阶段 |
| `move` | `Readonly<IActionEvent>` | 移动事件的冒泡阶段 |
| `upCapture` | `Readonly<IActionEvent>` | 抬起事件的捕获阶段 |
| `up` | `Readonly<IActionEvent>` | 抬起事件的冒泡阶段 |
| `enter` | `Readonly<IActionEventBase>` | 进入元素事件 |
| `leave` | `Readonly<IActionEventBase>` | 离开元素事件 |
| `wheelCapture` | `Readonly<IWheelEvent>` | 滚轮事件的捕获阶段 |
| `wheel` | `Readonly<IWheelEvent>` | 滚轮事件的冒泡阶段 |
---
### ActionEventMap
| 键ActionType | 值类型 | 说明 |
| ---------------- | -------------- | ------------ |
| `Click` | `IActionEvent` | 点击事件 |
| `Down` | `IActionEvent` | 按下事件 |
| `Enter` | `IActionEvent` | 进入元素事件 |
| `Leave` | `IActionEvent` | 离开元素事件 |
| `Move` | `IActionEvent` | 移动事件 |
| `Up` | `IActionEvent` | 抬起事件 |
| `Wheel` | `IWheelEvent` | 滚轮事件 |
---
## 总使用示例
::: code-group
```typescript
// 创建渲染元素(以 Sprite 为例)
const item = new Sprite();
// 监听点击事件(冒泡阶段)
item.on('click', ev => {
console.log('点击坐标:', ev.offsetX, ev.offsetY);
ev.stopPropagation(); // 阻止冒泡
});
// 监听滚轮事件(捕获阶段)
item.on('wheelCapture', ev => {
console.log('滚轮滚动量:', ev.wheelY, '单位:', WheelType[ev.wheelType]);
});
// 监听进入元素事件
item.on('enter', ev => {
console.log('进入元素,触发按键:', MouseType[ev.type]);
});
```
```tsx
// 监听点击事件(冒泡阶段)
const click = (ev: IActionEvent) => {
console.log('点击坐标:', ev.offsetX, ev.offsetY);
ev.stopPropagation(); // 阻止冒泡
};
// 监听滚轮事件(捕获阶段)
const wheel = (ev: IWheelEvent) => {
console.log('滚轮滚动量:', ev.wheelY, '单位:', WheelType[ev.wheelType]);
};
// 监听进入元素事件
const enter = (ev: IActionEventBase) => {
console.log('进入元素,触发按键:', MouseType[ev.type]);
};
<sprite onClick={click} onWheelCapture={wheel} onEnter={enter} />;
```
:::

View File

@ -0,0 +1,149 @@
# GL2 类 API 文档
**需丰富**
本文档由 `DeepSeek R1` 模型生成并微调。
## 继承关系
```mermaid
graph LR
EventEmitter --> RenderItem
RenderItem --> GL2
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ------------------------------- | ------------------------ | ------------------ | --------------------------------------------- |
| `support` | `boolean`(静态) | 检测 WebGL2 支持性 | 标识当前环境是否支持 WebGL2 |
| `canvas` | `HTMLCanvasElement` | - | 绑定的 WebGL2 画布元素 |
| `gl` | `WebGL2RenderingContext` | - | WebGL2 渲染上下文 |
| `UNIFORM_1f` ~ `UNIFORM_4uiv` | `UniformType` 枚举 | 对应枚举值 | WebGL uniform 类型常量(共 25 种) |
| `U_MATRIX_2x2` ~ `U_MATRIX_4x4` | `UniformMatrix` 枚举 | 对应枚举值 | 矩阵类型 uniform 常量9 种) |
| `ATTRIB_1f` ~ `ATTRIB_I4uiv` | `AttribType` 枚举 | 对应枚举值 | 顶点属性类型常量12 种) |
| `MAX_TEXTURE_COUNT` | `number` | `0` | 最大纹理支持数量(实际值由 WebGL 上下文决定) |
---
## 构造方法
### `constructor`
**参数**
- `type`: 渲染模式(`absolute` 绝对定位 / `static` 跟随摄像机)
**行为**
- 初始化 WebGL2 上下文
- 自动检测 WebGL2 支持性(通过静态属性 `support`
- 设置默认渲染模式
---
## 方法说明
### `createProgram`
```typescript
function createProgram<T extends GL2Program>(
Program: ProgramConstructor<T>,
vs?: string,
fs?: string
): T;
```
**描述**
创建 WebGL 着色器程序
**参数**
- `Program`: 着色器程序类(需继承 `GL2Program`
- `vs`: 自定义顶点着色器代码(可选)
- `fs`: 自定义片元着色器代码(可选)
**示例**
```typescript
class MyProgram extends GL2Program {}
const program = gl2.createProgram(MyProgram);
```
---
### `useProgram`
```typescript
function useProgram(program: GL2Program): void;
```
**描述**
切换当前使用的着色器程序
**示例**
```typescript
gl2.useProgram(shaderProgram);
```
---
### `framebuffer`
```typescript
function framebuffer(
name: string,
texture: IShaderTexture2D,
clear?: boolean
): void;
```
**描述**
将渲染结果输出到帧缓冲纹理
**参数**
- `name`: 帧缓冲名称
- `texture`: 目标纹理对象
- `clear`: 是否清空画布
---
### `drawScene`(抽象方法)
```typescript
function drawScene(
canvas: MotaOffscreenCanvas2D,
gl: WebGL2RenderingContext,
program: GL2Program,
transform: Transform
): void;
```
**描述**
抽象渲染方法,子类必须实现具体绘制逻辑
---
## 静态方法说明
### `GL2.support`
```typescript
static readonly support: boolean;
```
**描述**
静态只读属性,检测 WebGL2 支持性
**示例**
```typescript
if (GL2.support) {
// 初始化 WebGL2 功能
}
```
---
## 总使用示例
暂时没有。

View File

@ -0,0 +1,186 @@
# GL2Program 类 API 文档
**需丰富**
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
GL2Program --> EventEmitter
```
---
## 属性说明
| 属性名 | 类型 | 说明 |
| -------------- | ------------------------ | ------------------------------------------ |
| `gl` | `WebGL2RenderingContext` | WebGL2 渲染上下文 |
| `element` | `GL2` | 关联的 GL2 渲染元素 |
| `program` | `WebGLProgram \| null` | WebGL 着色器程序对象 |
| `renderMode` | `RenderMode` | 当前渲染模式(默认 `RenderMode.Elements` |
| `usingIndices` | `IShaderIndices \| null` | 当前使用的顶点索引数组 |
---
## 方法说明
### `defineUniform`
```typescript
function defineUniform<T extends UniformType>(
uniform: string,
type: T
): IShaderUniform<T> | null;
```
**描述**
定义 Uniform 变量
**参数**
- `uniform`: Uniform 变量名
- `type`: Uniform 类型(如 `GL2.UNIFORM_2f`
**返回值**
- 操作对象(可设置值)或 `null`(定义失败)
---
### `defineTexture`
```typescript
function defineTexture(
name: string,
index: number,
w?: number,
h?: number
): IShaderTexture2D | null;
```
**描述**
定义纹理对象
**参数**
- `name`: 纹理名称
- `index`: 纹理索引(建议不超过 8
- `w`: 纹理宽度(可选)
- `h`: 纹理高度(可选)
**示例**
```typescript
const tex = program.defineTexture('diffuse', 0, 512, 512);
```
---
### `paramElements`
```typescript
function paramElements(
mode: GLenum,
count: number,
type: GLenum,
offset: number
): void;
```
**描述**
设置元素模式渲染参数
**参数**
- `mode`: 渲染模式(如 `gl.TRIANGLES`
- `count`: 元素数量
- `type`: 数据类型(如 `gl.UNSIGNED_SHORT`
- `offset`: 数据偏移量
---
### `requestCompile`
```typescript
function requestCompile(force?: boolean): boolean;
```
**描述**
请求编译着色器
**参数**
- `force`: 是否强制重新编译
**返回值**
- `true` 表示编译成功
---
### `vs`
```typescript
function vs(vs: string): void;
```
**描述**
设置顶点着色器代码
**示例**
```typescript
program.vs(`
${GL2_PREFIX.VERTEX}
in vec4 aPosition;
void main() {
gl_Position = aPosition;
}
`);
```
---
## 事件说明
| 事件名 | 触发时机 | 参数类型 |
| -------- | ---------------- | -------- |
| `load` | 程序被加载使用时 | `[]` |
| `unload` | 程序被卸载时 | `[]` |
---
## 总使用示例
```typescript
// 创建着色器程序
const program = gl2.createProgram(GL2Program);
// 定义着色器
program.vs(`
${GL2_PREFIX.VERTEX}
uniform mat4 uProjection;
in vec4 aPosition;
void main() {
gl_Position = uProjection * aPosition;
}
`);
program.fs(`
${GL2_PREFIX.FRAGMENT}
out vec4 fragColor;
uniform vec3 uColor;
void main() {
fragColor = vec4(uColor, 1.0);
}
`);
// 定义 Uniform 和纹理
const colorUniform = program.defineUniform('uColor', UniformType.Uniform3f);
const diffuseTex = program.defineTexture('diffuse', 0, 512, 512);
// 设置渲染参数
program.paramElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
// 编译并应用
if (program.requestCompile()) {
gl2.useProgram(program);
colorUniform?.set(1.0, 0.5, 0.2);
diffuseTex?.set(imageElement);
}
```

View File

@ -0,0 +1,309 @@
# MotaOffscreenCanvas2D 类 API 文档
以下内容由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
MotaOffscreenCanvas2D --> EventEmitter
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ---------------- | -------------------------- | -------- | ------------------------------------------- |
| `canvas` | `HTMLCanvasElement` | - | 关联的 HTML 画布元素 |
| `ctx` | `CanvasRenderingContext2D` | - | 画布的 2D 渲染上下文 |
| `width` | `number` | 自动计算 | 画布的逻辑宽度(不包含缩放比例) |
| `height` | `number` | 自动计算 | 画布的逻辑高度(不包含缩放比例) |
| `autoScale` | `boolean` | `false` | 是否自动跟随 `core.domStyle.scale` 进行缩放 |
| `highResolution` | `boolean` | `true` | 是否启用高清画布(根据设备像素比例缩放) |
| `antiAliasing` | `boolean` | `true` | 是否启用抗锯齿 |
| `scale` | `number` | `1` | 当前画布的缩放比例 |
| `symbol` | `number` | `0` | 更新标识符,值变化表示画布被被动清空或调整 |
| `freezed` | `boolean`(只读) | `false` | 当前画布是否被冻结(冻结后不可修改属性) |
| `active` | `boolean`(只读) | `true` | 当前画布是否处于激活状态 |
---
## 构造方法
### `constructor`
```ts
function constructor(
alpha: boolean = true,
canvas?: HTMLCanvasElement
): MotaOffscreenCanvas2D;
```
**描述**
创建一个新的离屏画布。
**参数**
- `alpha`: 是否启用透明度通道(默认为 `true`)。
- `canvas`: 可指定现有画布,未提供时自动创建新画布。
**注意**
- 在自定义渲染元素中,建议使用 `RenderItem.requireCanvas` 而非直接调用此构造函数。
---
## 方法说明
### `size`
```ts
function size(width: number, height: number): void;
```
**描述**
设置画布的尺寸。
**参数**
- `width`: 逻辑宽度(最小为 1
- `height`: 逻辑高度(最小为 1
**行为**
- 自动计算缩放比例(考虑 `highResolution``autoScale`)。
- 调整画布物理尺寸和样式尺寸。
**示例**
```typescript
const canvas = new MotaOffscreenCanvas2D();
canvas.size(800, 600); // 设置画布尺寸为 800x600逻辑尺寸
```
---
### `withGameScale`
```ts
function withGameScale(auto: boolean): void;
```
**描述**
设置画布是否跟随 `core.domStyle.scale` 自动缩放。
**参数**
- `auto`: 是否启用自动缩放。
**示例**
```typescript
canvas.withGameScale(true); // 启用自动缩放
```
---
### `setHD`
```ts
function setHD(hd: boolean): void;
```
**描述**
设置是否为高清画布(基于设备像素比例)。
**参数**
- `hd`: 是否启用高清模式。
**示例**
```typescript
canvas.setHD(false); // 关闭高清模式
```
---
### `setAntiAliasing`
```ts
function setAntiAliasing(anti: boolean): void;
```
**描述**
设置抗锯齿功能。
**参数**
- `anti`: 是否启用抗锯齿。
**示例**
```typescript
canvas.setAntiAliasing(false); // 关闭抗锯齿
```
---
### `clear`
```ts
function clear(): void;
```
**描述**
清空画布内容。
**注意**
- 冻结状态下调用此方法会触发警告。
**示例**
```typescript
canvas.clear(); // 清空画布
```
---
### `delete`
```ts
function delete(): void
```
**描述**
删除画布,释放资源并解除 DOM 绑定。
**示例**
```typescript
canvas.delete(); // 删除画布
```
---
### `freeze`
```ts
function freeze(): void;
```
**描述**
冻结画布,禁止修改属性,并从全局列表中移除。
**示例**
```typescript
canvas.freeze(); // 冻结画布
```
---
### `activate`
```ts
function activate(): void;
```
**描述**
激活画布,使其跟随游戏缩放调整尺寸。
**示例**
```typescript
canvas.activate(); // 激活画布
```
---
### `deactivate`
```ts
function deactivate(): void;
```
**描述**
停用画布,不再自动调整尺寸,可能被垃圾回收。
**示例**
```typescript
canvas.deactivate(); // 停用画布
```
---
## 静态方法说明
### `MotaOffscreenCanvas2D.clone`
```ts
function clone(canvas: MotaOffscreenCanvas2D): MotaOffscreenCanvas2D;
```
**描述**
复制一个画布对象,结果画布将被冻结。
**返回值**
- 复制的画布对象(不可修改属性,但可绘制)。
**示例**
```typescript
const cloned = MotaOffscreenCanvas2D.clone(sourceCanvas); // 复制画布
```
---
### `MotaOffscreenCanvas2D.refreshAll`
```ts
function refreshAll(force: boolean = false): void;
```
**描述**
刷新所有已注册画布的尺寸(仅在窗口大小变化时自动调用)。
**参数**
- `force`: 是否强制刷新所有画布(默认仅刷新启用 `autoScale` 的画布)。
---
## 事件类型
### `resize`
**触发时机**
当画布被动调整尺寸时触发(例如窗口大小变化或 `core.domStyle.scale` 变化)。
**监听示例**
```typescript
canvas.on('resize', () => {
console.log('画布尺寸已调整');
});
```
---
## 使用示例
```typescript
// 创建画布
const canvas = new MotaOffscreenCanvas2D();
// 配置属性
canvas.size(800, 600);
canvas.withGameScale(true);
canvas.setHD(true);
// 监听调整事件
canvas.on('resize', () => {
console.log('画布尺寸已更新');
});
// 绘制内容
canvas.ctx.fillStyle = 'red';
canvas.ctx.fillRect(0, 0, canvas.width, canvas.height);
// 冻结画布
canvas.freeze();
// 复制画布
const cloned = MotaOffscreenCanvas2D.clone(canvas);
```

View File

@ -0,0 +1,172 @@
# MotaRenderer 类 API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
EventEmitter --> RenderItem
RenderItem --> Container
Container --> MotaRenderer
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| -------- | ------------------------- | ----------- | ------------------------------- |
| `isRoot` | `boolean` | `true` | 标识为渲染树根节点 |
| `target` | `MotaOffscreenCanvas2D` | - | 绑定的目标画布 |
| `idMap` | `Map<string, RenderItem>` | `new Map()` | ID 到渲染元素的映射表(受保护) |
---
## 构造方法
### `constructor`
**参数**
- `id`: 目标 canvas 元素的 DOM ID默认为 `render-main`
**行为**
- 自动绑定指定 ID 的 canvas 元素
- 初始化渲染循环和事件监听
- 设置默认锚点为中心点0.5, 0.5
**示例**
```typescript
// 创建主渲染器
const renderer = new MotaRenderer();
// 创建带自定义 ID 的渲染器
const customRenderer = new MotaRenderer('game-canvas');
```
---
## 方法说明
### `getElementById`
```typescript
function getElementById(id: string): RenderItem | null;
```
**描述**
通过 ID 获取渲染树中的元素。
**示例**
```typescript
const hero = renderer.getElementById('player');
```
---
### `refresh`
```typescript
function refresh(): void;
```
**描述**
强制刷新渲染内容(清空画布并重新渲染所有元素)。
---
### `toTagTree`
```typescript
function toTagTree(space?: number): string;
```
**描述**
(调试用)将渲染树输出为 XML 格式字符串。
**参数**
- `space`: 缩进空格数
**示例**
```typescript
console.log(renderer.toTagTree());
/* 输出示例:
<MotaRenderer id="render-main" uid="0">
<Container uid="1">
<Sprite id="cloud" uid="2" />
</Container>
</MotaRenderer>
*/
```
---
### `destroy`
```typescript
function destroy(): void;
```
**描述**
销毁渲染器,释放所有资源并解除事件监听。
---
## 静态方法说明
### `MotaRenderer.get`
```typescript
function get(id: string): MotaRenderer | undefined;
```
**描述**
通过 ID 获取已注册的渲染器实例。
**示例**
```typescript
const mainRenderer = MotaRenderer.get('render-main');
```
---
## 总使用示例
```typescript
// 初始化渲染器
const renderer = new MotaRenderer();
// 创建游戏元素
const player = new Sprite();
player.size(32, 32);
player.setRenderFn(canvas => {
canvas.ctx.fillStyle = 'blue';
canvas.ctx.fillRect(0, 0, 32, 32);
});
// 添加交互逻辑
player.on('click', ev => {
console.log('玩家被点击', ev.offsetX, ev.offsetY);
});
// 构建场景
const scene = new Container('absolute');
scene.appendChild(player);
renderer.appendChild(scene);
// 动态查找元素
setTimeout(() => {
const found = renderer.getElementById('player');
found?.pos(100, 100);
}, 1000);
// 销毁渲染器(退出时调用)
window.addEventListener('beforeunload', () => {
renderer.destroy();
});
```

View File

@ -0,0 +1,230 @@
# RenderAdapter API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
```mermaid
graph LR
RenderAdapter --> 无继承关系
```
_RenderAdapter 为独立类无父类或子类。_
---
## 属性说明
| 属性名 | 类型 | 描述 |
| ------------------ | --------------------------------- | ------------------------------ |
| `items` | `Set<T>` | 所有元素的集合 |
| `id` | `string` | 适配器的唯一标识符 |
| `adapters`(静态) | `Map<string, RenderAdapter<any>>` | 全局存储所有已创建的适配器实例 |
---
## 构造方法
### `constructor`
```typescript
function constructor(id: string): RenderAdapter<T>;
```
创建一个适配器实例并自动注册到全局 `adapters` 集合中。
**示例:**
```typescript
const adapter = new RenderAdapter<HTMLElement>('ui-elements');
```
---
## 方法说明
### `add`
```typescript
function add(item: T): void;
```
向集合中添加一个元素。
**示例:**
```typescript
adapter.add(document.getElementById('box'));
```
### `remove`
```typescript
function remove(item: T): void;
```
从集合中移除一个元素。
**示例:**
```typescript
adapter.remove(document.getElementById('box'));
```
### `receiveGlobal`
```typescript
function receiveGlobal(
id: string,
fn: (...params: any[]) => Promise<any>
): void;
```
注册全局异步函数(不与具体元素绑定)。
**示例:**
```typescript
adapter.receiveGlobal('refresh', async () => {
await fetchData();
});
```
### `receive`
```typescript
function receive(
id: string,
fn: (item: T, ...params: any[]) => Promise<any>
): void;
```
注册元素的异步执行函数。
**示例:**
```typescript
adapter.receive('fadeOut', async (element: HTMLElement) => {
element.style.opacity = '0';
await new Promise(resolve => setTimeout(resolve, 1000));
});
```
### `receiveSync`
```typescript
function receiveSync(id: string, fn: (item: T, ...params: any[]) => any): void;
```
注册元素的同步执行函数。
**示例:**
```typescript
adapter.receiveSync('highlight', (element: HTMLElement) => {
element.style.backgroundColor = 'yellow';
});
```
### `all`
```typescript
function all<R = any>(fn: string, ...params: any[]): Promise<R[]>;
```
对所有元素执行异步函数,返回 `Promise.all` 结果。
**示例:**
```typescript
await adapter.all('fadeOut'); // 所有元素淡出
```
### `any`
```typescript
function any<R = any>(fn: string, ...params: any[]): Promise<R>;
```
对所有元素执行异步函数,返回 `Promise.any` 结果。
**示例:**
```typescript
await adapter.any('loadImage'); // 任一图片加载完成即继续
```
### `sync`
```typescript
function sync<R = any>(fn: string, ...params: any[]): R[];
```
对所有元素执行同步函数。
**示例:**
```typescript
adapter.sync('highlight'); // 所有元素高亮
```
### `global`
```typescript
function global<R = any>(id: string, ...params: any[]): Promise<R>;
```
调用全局异步函数。
**示例:**
```typescript
await adapter.global('refresh'); // 触发全局刷新
```
### `destroy`
```typescript
function destroy(): void;
```
销毁适配器实例并从全局 `adapters` 中移除。
**示例:**
```typescript
adapter.destroy();
```
---
## 静态方法说明
### `RenderAdapter.get`
```typescript
function get<T>(id: string): RenderAdapter<T> | undefined;
```
通过 ID 获取已注册的适配器实例。
**示例:**
```typescript
const adapter = RenderAdapter.get<HTMLElement>('ui-elements');
```
---
## 总使用示例
```typescript
// 创建适配器
const animationAdapter = new RenderAdapter<HTMLElement>('animations');
// 注册动画函数
animationAdapter.receive('slideLeft', async (element: HTMLElement) => {
element.style.transform = 'translateX(-100px)';
await new Promise(resolve => setTimeout(resolve, 500));
});
// 添加元素
const box = document.getElementById('box');
animationAdapter.add(box);
// 执行动画
animationAdapter.all('slideLeft').then(() => {
console.log('所有元素滑动完成');
});
// 销毁适配器
animationAdapter.destroy();
```

View File

@ -0,0 +1,475 @@
# RenderItem 类 API 文档
**需丰富**
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
RenderItem --> EventEmitter
```
---
## 接口说明
### IRenderUpdater
```typescript
interface IRenderUpdater {
update(item?: RenderItem): void;
}
```
**描述**
定义元素更新能力的接口。`RenderItem` 通过 `update` 方法通知父元素需要重新渲染。
---
### IRenderAnchor
```typescript
interface IRenderAnchor {
anchorX: number;
anchorY: number;
setAnchor(x: number, y: number): void;
}
```
**描述**
管理元素锚点的接口。锚点用于定位元素的渲染基准点(如中心点、左上角等)。
---
### IRenderConfig
```typescript
interface IRenderConfig {
highResolution: boolean;
antiAliasing: boolean;
setHD(hd: boolean): void;
setAntiAliasing(anti: boolean): void;
}
```
**描述**
管理画布渲染配置的接口,控制高清模式和抗锯齿的开关。
---
### IRenderChildable
```typescript
interface IRenderChildable {
children: Set<RenderItem>;
appendChild(...child: RenderItem[]): void;
removeChild(...child: RenderItem[]): void;
requestSort(): void;
}
```
**描述**
管理子元素的接口。需在子类中实现具体逻辑(如 `Container` 元素)。
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ---------------- | -------------------------- | --------------- | ---------------------------------------------------- |
| `uid` | `number` | 自动递增 | 元素的唯一标识符 |
| `id` | `string` | `''` | 元素 ID原则不可重复 |
| `zIndex` | `number` | `0` | 元素的纵深层级(决定遮挡关系) |
| `width` | `number` | `200` | 元素的逻辑宽度 |
| `height` | `number` | `200` | 元素的逻辑高度 |
| `anchorX` | `number` | `0` | 锚点横坐标(`0` 左端,`1` 右端) |
| `anchorY` | `number` | `0` | 锚点纵坐标(`0` 上端,`1` 下端) |
| `type` | `RenderItemPosition` | `'static'` | 渲染模式(`absolute` 绝对定位,`static` 跟随摄像机) |
| `highResolution` | `boolean` | `true` | 是否启用高清画布 |
| `antiAliasing` | `boolean` | `true` | 是否启用抗锯齿 |
| `hidden` | `boolean` | `false` | 元素是否隐藏 |
| `filter` | `string` | `'none'` | 元素的滤镜效果 |
| `composite` | `GlobalCompositeOperation` | `'source-over'` | 渲染混合模式 |
| `alpha` | `number` | `1` | 元素的不透明度(`0` 透明,`1` 不透明) |
| `cursor` | `string` | `'inherit'` | 鼠标悬停时的光标样式 |
| `noEvent` | `boolean` | `false` | 是否忽略交互事件 |
| `isRoot` | `boolean` | `false` | 是否为根元素(需实现 `IRenderTreeRoot` 接口) |
| `connected` | `boolean` | 自动计算 | 元素是否已连接到根元素 |
**特殊属性说明**
- `transform`: 元素的变换矩阵(`Transform` 实例),修改时会自动触发 `updateTransform`
---
## 构造方法
### `constructor(type: RenderItemPosition, enableCache: boolean = true, transformFallThrough: boolean = false)`
**参数**
- `type`: 渲染模式(`absolute` 或 `static`
- `enableCache`: 是否启用渲染缓存(默认启用)
- `transformFallThrough`: 是否启用变换矩阵下穿机制(默认关闭)
**示例**
```typescript
const item = new RenderItem('absolute');
```
---
## 方法说明
### `size`
```typescript
function size(width: number, height: number): void;
```
**描述**
设置元素的尺寸。
**示例**
```typescript
item.size(300, 200); // 设置宽度 300高度 200
```
---
### `pos`
```typescript
function pos(x: number, y: number): void;
```
**描述**
设置元素的坐标(等效于修改 `transform` 的平移量)。
**示例**
```typescript
item.pos(100, 50); // 设置坐标为 (100, 50)
```
---
### `append`
```typescript
function append(parent: RenderItem): void;
```
**描述**
将元素添加到指定父元素下。
**示例**
```typescript
const parent = new RenderItem('static');
item.append(parent); // 将 item 添加为 parent 的子元素
```
---
### `remove`
```typescript
function remove(): boolean;
```
**描述**
从父元素中移除当前元素。
**返回值**
- `true` 表示移除成功,`false` 表示失败。
**示例**
```typescript
item.remove(); // 从父元素中移除
```
---
### `hide`
```typescript
function hide(): void;
```
**描述**
隐藏元素。
**示例**
```typescript
item.hide(); // 隐藏元素
```
---
### `show`
```typescript
function show(): void;
```
**描述**
显示元素。
**示例**
```typescript
item.show(); // 显示元素
```
---
### `delegateTicker`
```typescript
function delegateTicker(fn: TickerFn, time?: number, end?: () => void): number;
```
**描述**
委托动画帧函数,持续执行指定时间。
**返回值**
- 委托 ID可用于移除。
**示例**
```typescript
const id = item.delegateTicker(() => {
console.log('每帧执行');
}, 1000); // 持续 1 秒
```
---
### `destroy`
```typescript
function destroy(): void;
```
**描述**
销毁元素,释放资源。
**示例**
```typescript
item.destroy(); // 销毁元素
```
### `getAbsolutePosition`
```typescript
function getAbsolutePosition(x?: number, y?: number): [number, number];
```
**描述**
获取元素在全局坐标系中的绝对坐标。
**示例**
```typescript
const [absX, absY] = item.getAbsolutePosition(); // 获取元素原点绝对坐标
```
---
### `getBoundingRect`
```typescript
function getBoundingRect(): DOMRectReadOnly;
```
**描述**
获取元素的包围矩形(相对于父元素坐标系)。
**示例**
```typescript
const rect = item.getBoundingRect();
console.log(rect.width, rect.height);
```
---
### `setZIndex`
```typescript
function setZIndex(zIndex: number): void;
```
**描述**
设置元素的纵深层级(`zIndex` 越大越靠前)。
**示例**
```typescript
item.setZIndex(5); // 置顶显示
```
---
### `requestRenderFrame`
```typescript
function requestRenderFrame(fn: () => void): void;
```
**描述**
在下一帧渲染时执行函数(适用于需要在渲染流程中更新的操作)。
**示例**
```typescript
item.requestRenderFrame(() => {
item.pos(item.x + 1, item.y); // 每帧右移 1 单位
});
```
---
### `setFilter`
```typescript
function setFilter(filter: string): void;
```
**描述**
设置元素的 CSS 滤镜效果(如模糊、灰度等)。
**示例**
```typescript
item.setFilter('blur(5px)'); // 添加模糊效果
```
---
## 受保护方法说明
### `render`
```typescript
protected abstract render(canvas: MotaOffscreenCanvas2D, transform: Transform): void;
```
**描述**
抽象渲染方法,子类必须实现此方法以定义具体渲染逻辑。
**示例**
```typescript
class CustomItem extends RenderItem {
protected render(canvas: MotaOffscreenCanvas2D) {
canvas.ctx.fillStyle = 'red';
canvas.ctx.fillRect(0, 0, this.width, this.height);
}
}
```
---
### `isActionInElement`
```typescript
protected isActionInElement(x: number, y: number): boolean;
```
**描述**
判断坐标点是否在元素范围内(可覆盖实现自定义碰撞检测)。
**默认行为**
检测坐标是否在 `[0, width] x [0, height]` 矩形内。
---
## 静态方法说明
### `RenderItem.ticker`
**类型**
```typescript
const ticker: Ticker;
```
**描述**
全局动画帧管理器,用于处理所有委托的动画帧函数。
---
## 事件说明
事件继承自 [ERenderItemActionEvent](./Event.md#erenderitemactionevent)
| 事件名 | 参数类型 | 说明 |
| -------------- | ------------------------- | ------------------ |
| `beforeRender` | `Transform` | 渲染前触发 |
| `afterRender` | `Transform` | 渲染后触发 |
| `destroy` | `[]` | 元素销毁时触发 |
| `transform` | `[RenderItem, Transform]` | 变换矩阵更新时触发 |
---
## 总使用示例
::: code-group
```typescript [基础操作]
// 创建元素(以 Sprite 为例)
const item = new Sprite('static');
// 设置属性
item.size(400, 300);
item.pos(100, 50);
item.setAnchor(0.5, 0.5); // 设置中心锚点
item.setZIndex(2);
// 监听渲染事件
item.on('beforeRender', transform => {
console.log('即将渲染,变换矩阵:', transform);
});
// 添加动画效果
const tickerId = item.delegateTicker(time => {
item.pos(Math.sin(time / 1000) * 100, 50);
});
// 销毁元素
setTimeout(() => {
item.destroy();
}, 5000);
```
```typescript [创建自定义元素]
// 创建自定义可交互元素
class Button extends RenderItem {
constructor() {
super('static');
this.size(100, 40);
this.on('click', ev => {
console.log('按钮被点击!坐标:', ev.offsetX, ev.offsetY);
});
}
protected render(canvas: MotaOffscreenCanvas2D) {
// 绘制圆角矩形按钮
const ctx = canvas.ctx;
ctx.fillStyle = '#4CAF50';
ctx.roundRect(0, 0, this.width, this.height, 8);
ctx.fill();
}
}
// 使用按钮
const button = new Button();
button.pos(200, 150);
button.append(parentElement);
// 添加鼠标悬停效果
button.on('enter', () => button.setFilter('brightness(1.2)'));
button.on('leave', () => button.setFilter('none'));
```
:::
# RenderItem 类 API 文档(补充部分)
本文档由 `DeepSeek R1` 模型生成并微调。
---

View File

@ -0,0 +1,8 @@
# Shader 类 API 文档
```mermaid
graph LR
Shader --> GL2 --> RenderItem --> EventEmitter
```
用法同 [GL2](./GL2.md)

View File

@ -0,0 +1,8 @@
# Shader 类 API 文档
```mermaid
graph LR
ShaderProgram --> GL2Program --> EventEmitter
```
用法同 [GL2Program](./GL2Program.md)

View File

@ -0,0 +1,118 @@
# Sprite 类 API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
Sprite --> RenderItem --> EventEmitter
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| ---------- | ---------------- | ---------- | -------------------------------------- |
| `renderFn` | `RenderFunction` | `() => {}` | 自定义渲染函数,用于定义精灵的绘制逻辑 |
---
## 构造方法
### `constructor`
**参数**
- `type`: 渲染模式(`absolute` 绝对定位 / `static` 跟随摄像机)
- `cache`: 是否启用渲染缓存(默认启用)
- `fall`: 是否启用变换矩阵下穿机制(默认关闭)
**示例**
```typescript
const sprite = new Sprite('static');
```
---
## 方法说明
### `setRenderFn`
```typescript
function setRenderFn(fn: RenderFunction): void;
```
**描述**
设置自定义渲染函数,用于定义精灵的具体绘制逻辑。
**参数**
- `fn`: 接收画布和变换矩阵的回调函数,格式为 `(canvas, transform) => void`
**示例**
```typescript
sprite.setRenderFn((canvas, transform) => {
// 绘制一个红色矩形
canvas.ctx.fillStyle = 'red';
canvas.ctx.fillRect(0, 0, sprite.width, sprite.height);
});
```
---
## 总使用示例
```typescript
// 创建精灵实例
const sprite = new Sprite('absolute');
sprite.size(100, 100); // 设置尺寸
sprite.pos(200, 150); // 设置坐标
// 定义渲染逻辑
sprite.setRenderFn(canvas => {
const ctx = canvas.ctx;
// 绘制渐变圆形
const gradient = ctx.createRadialGradient(50, 50, 0, 50, 50, 50);
gradient.addColorStop(0, 'yellow');
gradient.addColorStop(1, 'orange');
ctx.fillStyle = gradient;
ctx.beginPath();
ctx.arc(50, 50, 50, 0, Math.PI * 2);
ctx.fill();
});
// 添加到父容器
container.appendChild(sprite);
// 监听变换事件
sprite.on('transform', (item, transform) => {
console.log('精灵变换矩阵更新:', transform);
});
```
---
## 高级用法示例
```typescript
// 创建动态旋转精灵
const rotatingSprite = new Sprite('static');
rotatingSprite.size(80, 80);
rotatingSprite.setRenderFn((canvas, transform) => {
canvas.ctx.fillStyle = 'blue';
canvas.ctx.fillRect(0, 0, 80, 80);
});
// 每帧旋转
rotatingSprite.delegateTicker(time => {
rotatingSprite.transform.setRotate(time / 1000);
});
// 添加到场景
rootContainer.appendChild(rotatingSprite);
```

View File

@ -0,0 +1,330 @@
# Transform 类 API 文档
以下内容由 `DeepSeek R1` 模型生成并微调。
---
## 继承关系
```mermaid
graph LR
Transform --> EventEmitter
```
---
## 属性说明
| 属性名 | 类型 | 默认值 | 说明 |
| -------------- | --------------------- | ----------- | ----------------------------------------------------------- |
| `mat` | `mat3` | 单位矩阵 | 存储当前变换的 3x3 矩阵 |
| `x` | `number` | `0` | 水平平移量 |
| `y` | `number` | `0` | 垂直平移量 |
| `scaleX` | `number` | `1` | 水平缩放比例 |
| `scaleY` | `number` | `1` | 垂直缩放比例 |
| `rad` | `number` | `0` | 旋转弧度值(范围:`[0, 2π)` |
| `modified` | `boolean`(私有) | `false` | 标识变换是否被修改过 |
| `bindedObject` | `ITransformUpdatable` | `undefined` | 绑定的对象(当变换更新时自动调用其 `updateTransform` 方法) |
---
## 构造方法
### `constructor`
创建一个新的变换实例,初始化为单位矩阵。
```typescript
const transform = new Transform();
```
---
## 方法说明
### `bind`
```typescript
function bind(obj?: ITransformUpdatable): void;
```
**描述**
绑定一个对象,当变换更新时自动调用其 `updateTransform` 方法(若存在)。
**示例**
```typescript
const obj = { updateTransform: () => console.log('Transform updated!') };
transform.bind(obj);
```
---
### `reset`
```typescript
function reset(): void;
```
**描述**
重置所有参数到初始状态(单位矩阵)。
**示例**
```typescript
transform.reset(); // 重置为 x=0, y=0, scaleX=1, scaleY=1, rad=0
```
---
### `scale`
```typescript
function scale(x: number, y: number = x): this;
```
**描述**
叠加缩放变换(相对于当前状态)。
**参数**
- `x`: 水平缩放比例
- `y`: 垂直缩放比例(默认同 `x`
**示例**
```typescript
transform.scale(2); // 水平和垂直均放大2倍
transform.scale(1.5, 0.5); // 水平放大1.5倍垂直缩小到0.5倍
```
---
### `translate`
```typescript
function translate(x: number, y: number): this;
```
**描述**
叠加平移变换(相对于当前状态)。
**参数**
- `x`: 水平平移量
- `y`: 垂直平移量
**示例**
```typescript
transform.translate(100, 50); // 向右平移100单位向下平移50单位
```
---
### `rotate`
```typescript
function rotate(rad: number): this;
```
**描述**
叠加旋转变换(相对于当前状态)。
**参数**
- `rad`: 旋转弧度值
**示例**
```typescript
transform.rotate(Math.PI / 2); // 顺时针旋转90度
```
---
### `setScale`
```typescript
function setScale(x: number, y: number = x): this;
```
**描述**
直接设置缩放比例(非叠加,覆盖当前状态)。
**示例**
```typescript
transform.setScale(3, 2); // 设置水平缩放3倍垂直缩放2倍
```
---
### `setTranslate`
```typescript
function setTranslate(x: number, y: number): this;
```
**描述**
直接设置平移量(非叠加,覆盖当前状态)。
**示例**
```typescript
transform.setTranslate(200, 100); // 直接定位到(200, 100)
```
---
### `setRotate`
```typescript
function setRotate(rad: number): this;
```
**描述**
直接设置旋转角度(非叠加,覆盖当前状态)。
**示例**
```typescript
transform.setRotate(Math.PI); // 设置旋转180度
```
---
### `transformed`
```typescript
function transformed(x: number, y: number): vec3;
```
**描述**
将坐标点 `(x, y)` 应用当前变换矩阵,返回变换后的坐标。
**返回值**
- `vec3`: 变换后的三维坐标(`[x, y, 1]`
**示例**
```typescript
const point = transform.transformed(10, 20); // 应用变换后的坐标
```
---
### `untransformed`
```typescript
function untransformed(x: number, y: number): vec3;
```
**描述**
将坐标点 `(x, y)` 逆向应用当前变换矩阵,返回原坐标。
**示例**
```typescript
const origin = transform.untransformed(50, 30); // 逆向变换后的坐标
```
---
### `clone`
```typescript
function clone(): Transform;
```
**描述**
复制当前变换实例。
**示例**
```typescript
const cloned = transform.clone(); // 生成一个完全相同的副本
```
---
## 静态方法说明
### `Transform.transformed`
```typescript
function transformed(transform: Transform, x: number, y: number): vec3;
```
**描述**
静态方法,直接通过变换矩阵计算坐标点 `(x, y)` 的变换结果。
**示例**
```typescript
const result = Transform.transformed(transform, 5, 5);
```
---
### `Transform.untransformed`
```typescript
function untransformed(transform: Transform, x: number, y: number): vec3;
```
**描述**
静态方法,直接通过变换矩阵逆向计算坐标点 `(x, y)` 的原位置。
**示例**
```typescript
const origin = Transform.untransformed(transform, 100, 50);
```
---
## 接口说明
### `ITransformUpdatable`
```typescript
interface ITransformUpdatable {
updateTransform?(): void;
}
```
**描述**
可绑定对象的接口,当变换更新时触发 `updateTransform` 方法(可选)。
---
## 总使用示例
```typescript
// 创建变换实例
const transform = new Transform();
// 应用变换
transform
.translate(50, 30)
.scale(2)
.rotate(Math.PI / 4);
// 绑定对象
const obj = {
updateTransform: () => console.log('Transform updated!')
};
transform.bind(obj);
// 坐标转换
const transformedPoint = transform.transformed(10, 10);
console.log('Transformed point:', transformedPoint);
// 复制变换
const cloned = transform.clone();
// 静态方法使用
const staticResult = Transform.transformed(cloned, 5, 5);
```

View File

@ -0,0 +1,119 @@
# 函数 API 文档
本文档由 `DeepSeek R1` 模型生成并微调。
---
## 函数说明
### `isWebGLSupported`
**功能**
检测浏览器是否支持 WebGL 1.0
**返回值**
- `true`: 支持
- `false`: 不支持
**示例**
```typescript
if (isWebGLSupported()) {
// 初始化 WebGL 1.0 功能
}
```
---
### `isWebGL2Supported`
**功能**
检测浏览器是否支持 WebGL 2.0
**返回值**
- `true`: 支持
- `false`: 不支持
---
### `addTiming`
**功能**
组合两个缓动函数为加法函数
**数学表达**
`newTiming(p) = timing1(p) + timing2(p)`
**参数**
- `timing1`: 第一个缓动函数
- `timing2`: 第二个缓动函数
**示例**
```typescript
const linear = (p: number) => p;
const bounce = (p: number) => p * p;
const combined = addTiming(linear, bounce); // p + p²
```
---
### `multiplyTiming`
**功能**
组合两个缓动函数为乘法函数
**数学表达**
`newTiming(p) = timing1(p) * timing2(p)`
---
### `isSetEqual`
**功能**
判断两个集合是否相等(元素完全相同)
**实现逻辑**
1. 直接引用相同 → `true`
2. 大小不同 → `false`
3. 检查 set1 是否是 set2 的子集
---
### `transformCanvas`
**功能**
将变换矩阵应用到画布上下文
**实现逻辑**
```typescript
const mat = transform.mat; // 获取 3x3 矩阵
const [a, b, , c, d, , e, f] = mat; // 分解为 2D 变换参数
ctx.transform(a, b, c, d, e, f); // 应用变换
```
**参数**
- `canvas`: 目标画布对象
- `transform`: 变换矩阵
**示例**
```typescript
const transform = new Transform();
transform.translate(100, 50);
transformCanvas(myCanvas, transform); // 应用平移变换
```
---
## 工具函数关系图
```mermaid
graph LR
checkSupport --> isWebGLSupported
checkSupport --> isWebGL2Supported
addTiming --> 组合缓动函数
multiplyTiming --> 组合缓动函数
isSetEqual --> 集合操作
transformCanvas --> 矩阵变换
```

View File

@ -1,3 +1 @@
# @motajs/render-core # @motajs/render-core
目录: