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
This commit is contained in:
1 parent
2947ca3b9d
commit
d15a3947ab
3 files changed
+304
No files matched your search
@@ -0,0 +1,77 @@
|
||||
#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);
|
||||
Reference in new issue
Block a user