载入中...
搜索中...
未找到
SceneInternal.h
浏览该文件的文档.
1#pragma once
2
3// Internal helpers shared between scene/Scene.cpp and scene/SceneNodes.cpp.
4//
5// Extracted verbatim from Scene.cpp when the node methods were split out.
6// Anonymous namespace: each translation unit gets its own internal copy,
7// exactly like the original single file.
8
9#include "scene/SceneHost.h"
10
11#include <glm/glm.hpp>
12#include <glm/gtc/quaternion.hpp>
13
14#include <string>
15
16namespace eve::scene {
17namespace {
18
24int linkKindFromString(const std::string &kind) { return findLinkKind(kind.c_str()); }
25
26int syncModeFromString(const std::string &mode) {
27 return mode == "body" ? 1 : 0;
28}
29
30glm::quat nodeQuaternion(const SceneNode &n) {
31 return glm::angleAxis(n.yaw, glm::vec3(0.f, 1.f, 0.f)) *
32 glm::angleAxis(n.pitch, glm::vec3(1.f, 0.f, 0.f)) *
33 glm::angleAxis(n.roll, glm::vec3(0.f, 0.f, 1.f));
34}
35
37void decomposeWorld(const glm::mat4 &w, glm::vec3 &pos, glm::vec3 &euler,
38 glm::vec3 &scale) {
39 pos = glm::vec3(w[3]);
40 glm::vec3 c0(w[0]), c1(w[1]), c2(w[2]);
41 scale = glm::vec3(glm::length(c0), glm::length(c1), glm::length(c2));
42 if (scale.x > 1e-8f) c0 /= scale.x;
43 if (scale.y > 1e-8f) c1 /= scale.y;
44 if (scale.z > 1e-8f) c2 /= scale.z;
45 glm::mat3 rot(c0, c1, c2);
46 glm::quat q = glm::quat_cast(rot);
47 glm::vec3 e = glm::eulerAngles(q); // pitch(x), yaw(y), roll(z)
48 euler = glm::vec3(e.y, e.x, e.z);
49}
50
51} // namespace
52} // namespace eve::scene
Tok kind
glm::vec3 n
Definition Grass.cpp:64
int w
float scale
Definition TreeMesh.cpp:122
int findLinkKind(const char *kind)
Definition SceneLink.cpp:39