19 if (_nodePayloads.empty()) {
20 if (_meshPayloads.empty()) {
25 auto renderComponent = std::make_unique<RenderComponent>(
nullptr, root);
26 auto* renderComponentRaw = renderComponent.get();
27 for (
const auto& payload : _meshPayloads) {
31 auto* meshInstance =
new MeshInstance(payload.mesh.get(), payload.material.get(), root);
32 renderComponentRaw->meshInstances().push_back(meshInstance);
38 std::vector<Entity*> nodeEntities(_nodePayloads.size(),
nullptr);
39 for (
size_t i = 0; i < _nodePayloads.size(); ++i) {
40 const auto& nodePayload = _nodePayloads[i];
41 if (nodePayload.skip) {
44 auto* nodeEntity =
new Entity();
45 if (!nodePayload.name.empty()) {
46 nodeEntity->setName(nodePayload.name);
48 nodeEntity->setLocalPosition(
49 nodePayload.translation.getX(),
50 nodePayload.translation.getY(),
51 nodePayload.translation.getZ()
53 nodeEntity->setLocalRotation(nodePayload.rotation);
54 nodeEntity->setLocalScale(nodePayload.scale);
56 if (!nodePayload.meshPayloadIndices.empty()) {
57 auto renderComponent = std::make_unique<RenderComponent>(
nullptr, nodeEntity);
58 auto* renderComponentRaw = renderComponent.get();
59 for (
const auto meshPayloadIndex : nodePayload.meshPayloadIndices) {
60 if (meshPayloadIndex >= _meshPayloads.size()) {
63 const auto& meshPayload = _meshPayloads[meshPayloadIndex];
64 if (!meshPayload.mesh) {
67 auto* meshInstance =
new MeshInstance(meshPayload.mesh.get(), meshPayload.material.get(), nodeEntity);
68 meshInstance->setCastShadow(meshPayload.castShadow);
69 renderComponentRaw->meshInstances().push_back(meshInstance);
74 nodeEntities[i] = nodeEntity;
77 for (
size_t i = 0; i < _nodePayloads.size(); ++i) {
78 auto* parent = nodeEntities[i];
82 for (
const auto childIndex : _nodePayloads[i].children) {
83 if (childIndex < 0 || childIndex >=
static_cast<int>(nodeEntities.size())) {
86 auto* child = nodeEntities[
static_cast<size_t>(childIndex)];
88 parent->addChild(child);
93 if (_rootNodeIndices.empty()) {
94 std::vector<bool> isChild(nodeEntities.size(),
false);
95 for (
const auto& nodePayload : _nodePayloads) {
96 for (
const auto childIndex : nodePayload.children) {
97 if (childIndex >= 0 && childIndex <
static_cast<int>(isChild.size())) {
98 isChild[
static_cast<size_t>(childIndex)] =
true;
103 for (
size_t i = 0; i < nodeEntities.size(); ++i) {
104 auto* nodeEntity = nodeEntities[i];
105 if (nodeEntity && !isChild[i]) {
106 root->addChild(nodeEntity);
110 for (
const auto rootIndex : _rootNodeIndices) {
111 if (rootIndex < 0 || rootIndex >=
static_cast<int>(nodeEntities.size())) {
114 auto* nodeEntity = nodeEntities[
static_cast<size_t>(rootIndex)];
116 root->addChild(nodeEntity);
123 if (!_animTracks.empty()) {
124 auto animComponent = std::make_unique<AnimationComponent>(
nullptr, root);
125 for (
const auto& [name, track] : _animTracks) {
126 animComponent->addAnimation(name, track);