Skip to content

快速开始

以下代码绘制一条静态线段,持续 1 秒,随后消失。

cpp
import stucanvas;

using namespace StuCanvas;

// 入口函数:接收 Canvas 引用
STUCANVAS_MAIN(Canvas& canvas) {
    // 创建 Clip,帧范围 0-60,60 FPS → 持续 1 秒
    auto& clip_0 = canvas.createClip_Frame(0, 60);
    canvas.fps = 60;

    // 创建几何图,全部使用 auto& 接收引用
    auto& graph_0 = canvas.createSObjectGraph<double>();
    auto& free_point_0 = graph_0.createFreePoint2D(2.3, 4.0);
    auto& free_point_1 = graph_0.createFreePoint2D(6.0, 7.2);
    auto& segment_0 = graph_0.createSegment2D(free_point_0, free_point_1);

    // 将几何对象转换为渲染实例
    auto& instance_0 = canvas.createSObjectInstance();

    // 配置外观属性(点号访问成员)
    auto& appearance_segment = canvas.createSObjectAppearance(SObjectAppearanceMode::Common);
    appearance_segment.line_width = 0.2f;
    appearance_segment.rgba.r = 0.3f;
    appearance_segment.rgba.g = 0.3f;
    appearance_segment.rgba.b = 0.3f;
    appearance_segment.rgba.a = 1.0f;

    // 关联实例与外观、几何对象
    instance_0.appearance = &appearance_segment;
    instance_0.object = &segment_0;

    // 将实例提交到 Clip 的时间轴更新函数中
    clip_0.update_function = [&instance_0](Clip& clip, const Camera& camera,
                                            uint64_t time_frame, double time_ms) {
        clip.submitSObjectInstance(instance_0);
    };
}

编译为动态库后,在前端点击"重新加载"即可注入函数指针,无需重启进程。

StuCanvas 内所有 create* 方法创建的对象,其指针地址在对象存活期间保持稳定,不会因后续创建操作或内存管理行为导致悬垂引用。Lambda 捕获中存储的引用可在整个加载周期内安全使用。

下一节将讲解如何让这个线段动起来。

API 设计说明

全引用语义(auto&

所有工厂方法返回对象引用而非指针或句柄。调用方持有引用,生命周期由 Canvas 统一管理,不涉及拷贝或所有权转移。

函数入口宏(STUCANVAS_MAIN

Canvas& 为参数的函数入口替换传统 main()。编译为动态库后,前端将动态库中的该函数指针注入自身进程并调用。

Clip 时间模型

createClip_Frame(0, 60) 声明一个帧区间,结合 canvas.fps = 60 构成 1 秒时间窗口。clip.submitSObjectInstance() 每帧被调用一次;超出 Clip 帧范围后不再提交,对象自然消失。无需手动销毁逻辑。

外观与几何分离

createSObjectInstance() 作为中间层,分别通过指针字段关联外观(appearance)和几何(object)。外观配置独立于几何数据,可复用。

Lambda 捕获与热重载

clip_0.update_function 为可调用对象。前端每次"重新加载"时替换整个动态库的函数指针,Lambda 捕获的引用在当前加载周期内保持有效。