载入中...
搜索中...
未找到
SceneLinks.cpp
浏览该文件的文档.
1// Registers the scene link kinds backed by physics: 2D and 3D rigid bodies.
2//
3// These are the only kinds that can drive a node instead of following it
4// (syncMode 1), so they are also the only ones supplying pullWorld.
5
6#include "physics/Body.h"
7#include "physics/Body3D.h"
8#include "scene/SceneHost.h"
9#include "scene/SceneLink.h"
10
11#include <glm/gtc/quaternion.hpp>
12
13namespace eve::physics {
14namespace {
15
18
19void pushBody2D(const SceneNode &n, void *target) {
20 auto *b = static_cast<Body *>(target);
21 b->setPosition(n.x, n.y);
22 b->setAngle(n.roll);
23}
24
25void pullBody2D(SceneNode &n, void *target) {
26 auto *b = static_cast<Body *>(target);
27 n.x = b->getX();
28 n.y = b->getY();
29 n.roll = b->getAngle();
30}
31
32bool aliveBody2D(const void *target) {
33 return static_cast<const Body *>(target)->raw() != nullptr;
34}
35
36void pushBody3D(const SceneNode &n, void *target) {
37 auto *b = static_cast<Body3D *>(target);
38 b->setPosition(n.x, n.y, n.z);
39 glm::quat q = glm::angleAxis(n.yaw, glm::vec3(0.f, 1.f, 0.f)) *
40 glm::angleAxis(n.pitch, glm::vec3(1.f, 0.f, 0.f)) *
41 glm::angleAxis(n.roll, glm::vec3(0.f, 0.f, 1.f));
42 b->setRotation(q.x, q.y, q.z, q.w);
43}
44
45void pullBody3D(SceneNode &n, void *target) {
46 auto *b = static_cast<Body3D *>(target);
47 n.x = b->getX();
48 n.y = b->getY();
49 n.z = b->getZ();
50 glm::quat q(b->getRotW(), b->getRotX(), b->getRotY(), b->getRotZ());
51 glm::vec3 e = glm::eulerAngles(q); // pitch(x), yaw(y), roll(z)
52 n.pitch = e.x;
53 n.yaw = e.y;
54 n.roll = e.z;
55}
56
57bool aliveBody3D(const void *target) {
58 return static_cast<const Body3D *>(target)->isValid();
59}
60
61struct Register {
62 Register() {
63 eve::scene::registerLinkKind({"physics2d", &pushBody2D, &pullBody2D, &aliveBody2D});
64 eve::scene::registerLinkKind({"physics3d", &pushBody3D, &pullBody3D, &aliveBody3D});
65 }
66} g_register;
67
68} // namespace
69} // namespace eve::physics
glm::vec3 n
Definition Grass.cpp:64
uint32_t b
int registerLinkKind(const LinkOps &ops)
Definition SceneLink.cpp:27
Retained scene node (arena). Conceptual GameObject; isomorphic to eve::ui::UINode.
Definition SceneHost.h:39