Rename skeleton generator to bone generator
parent
374f16038d
commit
ef0fe2dcfe
|
@ -95,6 +95,8 @@ include(third_party/QtAwesome/QtAwesome/QtAwesome.pri)
|
||||||
|
|
||||||
HEADERS += sources/about_widget.h
|
HEADERS += sources/about_widget.h
|
||||||
SOURCES += sources/about_widget.cc
|
SOURCES += sources/about_widget.cc
|
||||||
|
HEADERS += sources/bone_generator.h
|
||||||
|
SOURCES += sources/bone_generator.cc
|
||||||
HEADERS += sources/bone_list_model.h
|
HEADERS += sources/bone_list_model.h
|
||||||
SOURCES += sources/bone_list_model.cc
|
SOURCES += sources/bone_list_model.cc
|
||||||
HEADERS += sources/bone_manage_widget.h
|
HEADERS += sources/bone_manage_widget.h
|
||||||
|
@ -310,8 +312,8 @@ HEADERS += ../dust3d/mesh/tube_mesh_builder.h
|
||||||
SOURCES += ../dust3d/mesh/tube_mesh_builder.cc
|
SOURCES += ../dust3d/mesh/tube_mesh_builder.cc
|
||||||
HEADERS += ../dust3d/mesh/weld_vertices.h
|
HEADERS += ../dust3d/mesh/weld_vertices.h
|
||||||
SOURCES += ../dust3d/mesh/weld_vertices.cc
|
SOURCES += ../dust3d/mesh/weld_vertices.cc
|
||||||
HEADERS += ../dust3d/rig/skeleton_generator.h
|
HEADERS += ../dust3d/rig/bone_generator.h
|
||||||
SOURCES += ../dust3d/rig/skeleton_generator.cc
|
SOURCES += ../dust3d/rig/bone_generator.cc
|
||||||
HEADERS += ../dust3d/uv/chart_packer.h
|
HEADERS += ../dust3d/uv/chart_packer.h
|
||||||
SOURCES += ../dust3d/uv/chart_packer.cc
|
SOURCES += ../dust3d/uv/chart_packer.cc
|
||||||
HEADERS += ../dust3d/uv/max_rectangles.h
|
HEADERS += ../dust3d/uv/max_rectangles.h
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "bone_generator.h"
|
||||||
|
#include <dust3d/mesh/smooth_normal.h>
|
||||||
|
#include <dust3d/mesh/trim_vertices.h>
|
||||||
|
|
||||||
|
void BoneGenerator::process()
|
||||||
|
{
|
||||||
|
generate();
|
||||||
|
|
||||||
|
m_bonePreviewMeshes = std::make_unique<std::map<dust3d::Uuid, std::unique_ptr<ModelMesh>>>();
|
||||||
|
for (auto& it : bonePreviews()) {
|
||||||
|
dust3d::trimVertices(&it.second.vertices, true);
|
||||||
|
for (auto& it : it.second.vertices) {
|
||||||
|
it *= 2.0;
|
||||||
|
}
|
||||||
|
std::vector<dust3d::Vector3> previewTriangleNormals;
|
||||||
|
previewTriangleNormals.reserve(it.second.triangles.size());
|
||||||
|
for (const auto& face : it.second.triangles) {
|
||||||
|
previewTriangleNormals.emplace_back(dust3d::Vector3::normal(
|
||||||
|
it.second.vertices[face[0]],
|
||||||
|
it.second.vertices[face[1]],
|
||||||
|
it.second.vertices[face[2]]));
|
||||||
|
}
|
||||||
|
std::vector<std::vector<dust3d::Vector3>> previewTriangleVertexNormals;
|
||||||
|
dust3d::smoothNormal(it.second.vertices,
|
||||||
|
it.second.triangles,
|
||||||
|
previewTriangleNormals,
|
||||||
|
0,
|
||||||
|
&previewTriangleVertexNormals);
|
||||||
|
(*m_bonePreviewMeshes)[it.first] = std::make_unique<ModelMesh>(it.second.vertices,
|
||||||
|
it.second.triangles,
|
||||||
|
previewTriangleVertexNormals);
|
||||||
|
}
|
||||||
|
|
||||||
|
emit finished();
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef DUST3D_APPLICATION_BONE_GENERATOR_H_
|
||||||
|
#define DUST3D_APPLICATION_BONE_GENERATOR_H_
|
||||||
|
|
||||||
|
#include "model_mesh.h"
|
||||||
|
#include <QObject>
|
||||||
|
#include <dust3d/rig/bone_generator.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class BoneGenerator : public QObject, public dust3d::BoneGenerator {
|
||||||
|
Q_OBJECT
|
||||||
|
public slots:
|
||||||
|
void process();
|
||||||
|
signals:
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<std::map<dust3d::Uuid, std::unique_ptr<ModelMesh>>> m_bonePreviewMeshes;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -20,46 +20,46 @@
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dust3d/rig/skeleton_generator.h>
|
#include <dust3d/rig/bone_generator.h>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace dust3d {
|
namespace dust3d {
|
||||||
|
|
||||||
SkeletonGenerator::SkeletonGenerator()
|
BoneGenerator::BoneGenerator()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::setVertices(const std::vector<Vector3>& vertices)
|
void BoneGenerator::setVertices(const std::vector<Vector3>& vertices)
|
||||||
{
|
{
|
||||||
m_vertices = vertices;
|
m_vertices = vertices;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::setTriangles(const std::vector<std::vector<size_t>>& triangles)
|
void BoneGenerator::setTriangles(const std::vector<std::vector<size_t>>& triangles)
|
||||||
{
|
{
|
||||||
m_triangles = triangles;
|
m_triangles = triangles;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::setPositionToNodeMap(const std::map<PositionKey, Uuid>& positionToNodeMap)
|
void BoneGenerator::setPositionToNodeMap(const std::map<PositionKey, Uuid>& positionToNodeMap)
|
||||||
{
|
{
|
||||||
m_positionToNodeMap = positionToNodeMap;
|
m_positionToNodeMap = positionToNodeMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::addBone(const Uuid& boneId, const Bone& bone)
|
void BoneGenerator::addBone(const Uuid& boneId, const Bone& bone)
|
||||||
{
|
{
|
||||||
m_boneMap.emplace(std::make_pair(boneId, bone));
|
m_boneMap.emplace(std::make_pair(boneId, bone));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::addNode(const Uuid& nodeId, const Node& node)
|
void BoneGenerator::addNode(const Uuid& nodeId, const Node& node)
|
||||||
{
|
{
|
||||||
m_nodeMap.emplace(std::make_pair(nodeId, node));
|
m_nodeMap.emplace(std::make_pair(nodeId, node));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::addNodeBinding(const Uuid& nodeId, const NodeBinding& nodeBinding)
|
void BoneGenerator::addNodeBinding(const Uuid& nodeId, const NodeBinding& nodeBinding)
|
||||||
{
|
{
|
||||||
m_nodeBindingMap.emplace(std::make_pair(nodeId, nodeBinding));
|
m_nodeBindingMap.emplace(std::make_pair(nodeId, nodeBinding));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::buildEdges()
|
void BoneGenerator::buildEdges()
|
||||||
{
|
{
|
||||||
for (const auto& triangle : m_triangles) {
|
for (const auto& triangle : m_triangles) {
|
||||||
for (size_t i = 0; i < 3; ++i) {
|
for (size_t i = 0; i < 3; ++i) {
|
||||||
|
@ -70,7 +70,7 @@ void SkeletonGenerator::buildEdges()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Uuid SkeletonGenerator::resolveVertexSourceByBreadthFirstSearch(size_t vertexIndex, std::unordered_set<size_t>& visited)
|
Uuid BoneGenerator::resolveVertexSourceByBreadthFirstSearch(size_t vertexIndex, std::unordered_set<size_t>& visited)
|
||||||
{
|
{
|
||||||
visited.insert(vertexIndex);
|
visited.insert(vertexIndex);
|
||||||
auto findNeighbors = m_edges.find(vertexIndex);
|
auto findNeighbors = m_edges.find(vertexIndex);
|
||||||
|
@ -90,7 +90,7 @@ Uuid SkeletonGenerator::resolveVertexSourceByBreadthFirstSearch(size_t vertexInd
|
||||||
return Uuid();
|
return Uuid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::resolveVertexSources()
|
void BoneGenerator::resolveVertexSources()
|
||||||
{
|
{
|
||||||
m_vertexSourceNodes.resize(m_vertices.size());
|
m_vertexSourceNodes.resize(m_vertices.size());
|
||||||
for (size_t i = 0; i < m_vertices.size(); ++i) {
|
for (size_t i = 0; i < m_vertices.size(); ++i) {
|
||||||
|
@ -108,7 +108,7 @@ void SkeletonGenerator::resolveVertexSources()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::buildBoneJoints()
|
void BoneGenerator::buildBoneJoints()
|
||||||
{
|
{
|
||||||
for (auto& boneIt : m_boneMap) {
|
for (auto& boneIt : m_boneMap) {
|
||||||
boneIt.second.startPositions.resize(boneIt.second.joints.size());
|
boneIt.second.startPositions.resize(boneIt.second.joints.size());
|
||||||
|
@ -126,12 +126,12 @@ void SkeletonGenerator::buildBoneJoints()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::assignVerticesToBoneJoints()
|
void BoneGenerator::assignVerticesToBoneJoints()
|
||||||
{
|
{
|
||||||
// TODO:
|
// TODO:
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::groupBoneVertices()
|
void BoneGenerator::groupBoneVertices()
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < m_vertexSourceNodes.size(); ++i) {
|
for (size_t i = 0; i < m_vertexSourceNodes.size(); ++i) {
|
||||||
const Uuid& sourceNodeId = m_vertexSourceNodes[i];
|
const Uuid& sourceNodeId = m_vertexSourceNodes[i];
|
||||||
|
@ -146,7 +146,7 @@ void SkeletonGenerator::groupBoneVertices()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::generate()
|
void BoneGenerator::generate()
|
||||||
{
|
{
|
||||||
buildEdges();
|
buildEdges();
|
||||||
resolveVertexSources();
|
resolveVertexSources();
|
||||||
|
@ -156,7 +156,12 @@ void SkeletonGenerator::generate()
|
||||||
generateBonePreviews();
|
generateBonePreviews();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonGenerator::generateBonePreviews()
|
std::map<Uuid, BoneGenerator::BonePreview>& BoneGenerator::bonePreviews()
|
||||||
|
{
|
||||||
|
return m_bonePreviews;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoneGenerator::generateBonePreviews()
|
||||||
{
|
{
|
||||||
for (const auto& it : m_boneVertices) {
|
for (const auto& it : m_boneVertices) {
|
||||||
BonePreview bonePreview;
|
BonePreview bonePreview;
|
|
@ -20,8 +20,8 @@
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DUST3D_RIG_SKELETON_GENERATOR_H_
|
#ifndef DUST3D_RIG_BONE_GENERATOR_H_
|
||||||
#define DUST3D_RIG_SKELETON_GENERATOR_H_
|
#define DUST3D_RIG_BONE_GENERATOR_H_
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <dust3d/base/color.h>
|
#include <dust3d/base/color.h>
|
||||||
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
namespace dust3d {
|
namespace dust3d {
|
||||||
|
|
||||||
class SkeletonGenerator {
|
class BoneGenerator {
|
||||||
public:
|
public:
|
||||||
struct NodeBinding {
|
struct NodeBinding {
|
||||||
std::set<Uuid> boneIds;
|
std::set<Uuid> boneIds;
|
||||||
|
@ -63,7 +63,7 @@ public:
|
||||||
std::vector<std::vector<size_t>> triangles;
|
std::vector<std::vector<size_t>> triangles;
|
||||||
};
|
};
|
||||||
|
|
||||||
SkeletonGenerator();
|
BoneGenerator();
|
||||||
void setVertices(const std::vector<Vector3>& vertices);
|
void setVertices(const std::vector<Vector3>& vertices);
|
||||||
void setTriangles(const std::vector<std::vector<size_t>>& triangles);
|
void setTriangles(const std::vector<std::vector<size_t>>& triangles);
|
||||||
void setPositionToNodeMap(const std::map<PositionKey, Uuid>& positionToNodeMap);
|
void setPositionToNodeMap(const std::map<PositionKey, Uuid>& positionToNodeMap);
|
||||||
|
@ -71,6 +71,7 @@ public:
|
||||||
void addNodeBinding(const Uuid& nodeId, const NodeBinding& nodeBidning);
|
void addNodeBinding(const Uuid& nodeId, const NodeBinding& nodeBidning);
|
||||||
void addNode(const Uuid& nodeId, const Node& node);
|
void addNode(const Uuid& nodeId, const Node& node);
|
||||||
void generate();
|
void generate();
|
||||||
|
std::map<Uuid, BonePreview>& bonePreviews();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<Vector3> m_vertices;
|
std::vector<Vector3> m_vertices;
|
Loading…
Reference in New Issue