Files
lity3d/Engine/Scene/scene_graph.h
T
shuiyu1123 d15a3947ab feat: scene graph - node tree + transform inheritance
- SceneNode: position/rotation(scale) + parent/child hierarchy
- World matrix: local = translate * rotate * scale, world = parent.world * local
- Euler/Quaternion rotation support
- Dirty flag propagation for efficient updates
- Scene init/find/create/destroy operations
2026-07-11 12:43:23 +08:00

78 lines
2.0 KiB
C

#pragma once
// ============================================================================
// scene_graph.h - 场景图: 节点树 + 变换继承
// ============================================================================
#include "../ASM/math_c_fallback.h"
#include <stdint.h>
#define MAX_CHILDREN 64
#define MAX_NODES 1024
// 场景节点
typedef struct SceneNode {
int id;
char name[64];
// 本地变换
Vec3 position;
Quat rotation;
Vec3 scale;
// 世界矩阵 (每帧由 scene_update 计算)
Mat4 world_matrix;
Mat4 local_matrix;
// 层级
struct SceneNode* parent;
struct SceneNode* children[MAX_CHILDREN];
int child_count;
// 标志
int visible;
int dirty; // 需要重新计算矩阵
// 用户数据
void* user_data;
int user_type;
} SceneNode;
// 场景
typedef struct Scene {
SceneNode nodes[MAX_NODES];
int node_count;
SceneNode* root;
int next_id;
} Scene;
// 初始化/销毁
void scene_init(Scene* scene);
void scene_destroy(Scene* scene);
// 节点管理
SceneNode* scene_create_node(Scene* scene, const char* name);
void scene_destroy_node(Scene* scene, SceneNode* node);
SceneNode* scene_find_node(Scene* scene, int id);
SceneNode* scene_find_by_name(Scene* scene, const char* name);
// 层级
void scene_set_parent(SceneNode* child, SceneNode* parent);
void scene_add_child(SceneNode* parent, SceneNode* child);
void scene_remove_child(SceneNode* parent, SceneNode* child);
// 变换
void scene_set_position(SceneNode* node, float x, float y, float z);
void scene_set_rotation_euler(SceneNode* node, float rx, float ry, float rz);
void scene_set_scale(SceneNode* node, float sx, float sy, float sz);
void scene_set_rotation_quat(SceneNode* node, const Quat* q);
void scene_mark_dirty(SceneNode* node);
// 每帧更新
void scene_update(Scene* scene);
// 获取世界变换
void scene_get_world_position(SceneNode* node, Vec3* out);
void scene_get_world_rotation(SceneNode* node, Quat* out);
void scene_get_world_scale(SceneNode* node, Vec3* out);