载入中...
搜索中...
未找到
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
25int linkKindFromString(const std::string &kind) { return findLinkKind(kind.c_str()); }
26
28int syncModeFromString(const std::string &mode) {
29 return mode == "body" ? 1 : 0;
30}
31
33glm::quat nodeQuaternion(const SceneNode &n) {
35 return glm::angleAxis(n.yaw, glm::vec3(0.f, 1.f, 0.f)) *
37 glm::angleAxis(n.pitch, glm::vec3(1.f, 0.f, 0.f)) *
39 glm::angleAxis(n.roll, glm::vec3(0.f, 0.f, 1.f));
40}
41
44void decomposeWorld(const glm::mat4 &w, glm::vec3 &pos, glm::vec3 &euler,
45 glm::vec3 &scale) {
46 pos = glm::vec3(w[3]);
48 glm::vec3 c0(w[0]), c1(w[1]), c2(w[2]);
49 scale = glm::vec3(glm::length(c0), glm::length(c1), glm::length(c2));
50 if (scale.x > 1e-8f) c0 /= scale.x;
51 if (scale.y > 1e-8f) c1 /= scale.y;
52 if (scale.z > 1e-8f) c2 /= scale.z;
54 glm::mat3 rot(c0, c1, c2);
55 glm::quat q = glm::quat_cast(rot);
56 glm::vec3 e = glm::eulerAngles(q); // pitch(x), yaw(y), roll(z)
57 euler = glm::vec3(e.y, e.x, e.z);
58}
59
60} // namespace
61} // namespace eve::scene
float w
Definition AnimClip.cpp:738
glm::vec3 n
Definition Grass.cpp:63
std::array< double, 10 > q
TokenKind kind
std::array< float, 3 > scale
int findLinkKind(const char *kind)
Finds link kind.
Definition SceneLink.cpp:39