- 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
78 lines
2.0 KiB
C
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);
|