80 lines
2.2 KiB
C++
80 lines
2.2 KiB
C++
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include "PrimitiveData.hpp"
|
|
|
|
#include "AccessorData.hpp"
|
|
#include "BufferViewData.hpp"
|
|
#include "MaterialData.hpp"
|
|
|
|
PrimitiveData::PrimitiveData(
|
|
const AccessorData& indices,
|
|
const MaterialData& material,
|
|
std::shared_ptr<draco::Mesh> dracoMesh)
|
|
: indices(indices.ix),
|
|
material(material.ix),
|
|
mode(TRIANGLES),
|
|
dracoMesh(dracoMesh),
|
|
dracoBufferView(-1) {}
|
|
|
|
PrimitiveData::PrimitiveData(const AccessorData& indices, const MaterialData& material)
|
|
: indices(indices.ix),
|
|
material(material.ix),
|
|
mode(TRIANGLES),
|
|
dracoMesh(nullptr),
|
|
dracoBufferView(-1) {}
|
|
|
|
void PrimitiveData::AddAttrib(std::string name, const AccessorData& accessor) {
|
|
attributes[name] = accessor.ix;
|
|
}
|
|
|
|
void PrimitiveData::NoteDracoBuffer(const BufferViewData& data) {
|
|
dracoBufferView = data.ix;
|
|
}
|
|
|
|
void PrimitiveData::AddTarget(
|
|
const AccessorData* positions,
|
|
const AccessorData* normals,
|
|
const AccessorData* tangents) {
|
|
targetAccessors.push_back(std::make_tuple(
|
|
positions->ix,
|
|
normals != nullptr ? normals->ix : -1,
|
|
tangents != nullptr ? tangents->ix : -1));
|
|
targetNames.push_back(positions->name);
|
|
}
|
|
|
|
void to_json(json& j, const PrimitiveData& d) {
|
|
j = {{"material", d.material}, {"mode", d.mode}, {"attributes", d.attributes}};
|
|
if (d.indices >= 0) {
|
|
j["indices"] = d.indices;
|
|
}
|
|
if (!d.targetAccessors.empty()) {
|
|
json targets{};
|
|
int pIx, nIx, tIx;
|
|
for (auto accessor : d.targetAccessors) {
|
|
std::tie(pIx, nIx, tIx) = accessor;
|
|
json target{};
|
|
if (pIx >= 0) {
|
|
target["POSITION"] = pIx;
|
|
}
|
|
if (nIx >= 0) {
|
|
target["NORMAL"] = nIx;
|
|
}
|
|
if (tIx >= 0) {
|
|
target["TANGENT"] = tIx;
|
|
}
|
|
targets.push_back(target);
|
|
}
|
|
j["targets"] = targets;
|
|
}
|
|
if (!d.dracoAttributes.empty()) {
|
|
j["extensions"] = {{KHR_DRACO_MESH_COMPRESSION,
|
|
{{"bufferView", d.dracoBufferView}, {"attributes", d.dracoAttributes}}}};
|
|
}
|
|
}
|