mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 18:56:16 +03:00
114 lines
3.5 KiB
C++
114 lines
3.5 KiB
C++
//
|
|
// Copyright(c) 2016-2017 benikabocha.
|
|
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
|
|
//
|
|
|
|
#ifndef SABA_MODEL_MMD_PMDMODEL_H_
|
|
#define SABA_MODEL_MMD_PMDMODEL_H_
|
|
|
|
#include "MMDMaterial.h"
|
|
#include "MMDModel.h"
|
|
|
|
#include <glm/vec2.hpp>
|
|
#include <glm/vec3.hpp>
|
|
#include <glm/mat4x4.hpp>
|
|
|
|
#include <vector>
|
|
#include <string>
|
|
#include <algorithm>
|
|
|
|
namespace saba
|
|
{
|
|
class PMDModel : public MMDModel
|
|
{
|
|
public:
|
|
MMDNodeManager* GetNodeManager() override { return &m_nodeMan; }
|
|
MMDIKManager* GetIKManager() override { return &m_ikSolverMan; }
|
|
MMDMorphManager* GetMorphManager() override { return &m_morphMan; };
|
|
MMDPhysicsManager* GetPhysicsManager() override { return &m_physicsMan; }
|
|
|
|
size_t GetVertexCount() const override { return m_positions.size(); }
|
|
const glm::vec3* GetPositions() const override { return &m_positions[0]; }
|
|
const glm::vec3* GetNormals() const override { return &m_normals[0]; }
|
|
const glm::vec2* GetUVs() const override { return &m_uvs[0]; }
|
|
const glm::vec3* GetUpdatePositions() const override { return &m_updatePositions[0]; }
|
|
const glm::vec3* GetUpdateNormals() const override { return &m_updateNormals[0]; }
|
|
const glm::vec2* GetUpdateUVs() const override { return &m_uvs[0]; }
|
|
|
|
size_t GetIndexElementSize() const override { return sizeof(uint16_t); }
|
|
size_t GetIndexCount() const override { return m_indices.size(); }
|
|
const void* GetIndices() const override { return &m_indices[0]; }
|
|
|
|
size_t GetMaterialCount() const override { return m_materials.size(); }
|
|
const MMDMaterial* GetMaterials() const override { return &m_materials[0]; }
|
|
|
|
size_t GetSubMeshCount() const override { return m_subMeshes.size(); }
|
|
const MMDSubMesh* GetSubMeshes() const override { return &m_subMeshes[0]; }
|
|
|
|
MMDPhysics* GetMMDPhysics() override { return m_physicsMan.GetMMDPhysics(); }
|
|
|
|
void InitializeAnimation() override;
|
|
// アニメーションの前後で呼ぶ (VMDアニメーションの前後)
|
|
void BeginAnimation() override;
|
|
void EndAnimation() override;
|
|
// Morph
|
|
void UpdateMorphAnimation() override;
|
|
// ノードを更新する
|
|
void UpdateNodeAnimation(bool afterPhysicsAnim) override;
|
|
// Physicsを更新する
|
|
void ResetPhysics() override;
|
|
void UpdatePhysicsAnimation(float elapsed) override;
|
|
// 頂点データーを更新する
|
|
void Update() override;
|
|
void SetParallelUpdateHint(uint32_t) override {}
|
|
|
|
bool Load(const std::string& filepath, const std::string& mmdDataDir);
|
|
void Destroy();
|
|
|
|
const glm::vec3& GetBBoxMin() const { return m_bboxMin; }
|
|
const glm::vec3& GetBBoxMax() const { return m_bboxMax; }
|
|
|
|
protected:
|
|
|
|
private:
|
|
struct MorphVertex
|
|
{
|
|
uint32_t m_index;
|
|
glm::vec3 m_position;
|
|
};
|
|
|
|
class PMDMorph : public MMDMorph
|
|
{
|
|
public:
|
|
std::vector<MorphVertex> m_vertices;
|
|
};
|
|
|
|
private:
|
|
std::vector<glm::vec3> m_positions;
|
|
std::vector<glm::vec3> m_normals;
|
|
std::vector<glm::vec2> m_uvs;
|
|
std::vector<glm::ivec2> m_bones;
|
|
std::vector<glm::vec2> m_boneWeights;
|
|
std::vector<glm::vec3> m_updatePositions;
|
|
std::vector<glm::vec3> m_updateNormals;
|
|
std::vector<glm::mat4> m_transforms;
|
|
|
|
std::vector<uint16_t> m_indices;
|
|
|
|
PMDMorph m_baseMorph;
|
|
|
|
glm::vec3 m_bboxMin = glm::vec3(0);
|
|
glm::vec3 m_bboxMax = glm::vec3(0);
|
|
|
|
std::vector<MMDMaterial> m_materials;
|
|
std::vector<MMDSubMesh> m_subMeshes;
|
|
|
|
MMDNodeManagerT<MMDNode> m_nodeMan;
|
|
MMDIKManagerT<MMDIkSolver> m_ikSolverMan;
|
|
MMDMorphManagerT<PMDMorph> m_morphMan;
|
|
MMDPhysicsManager m_physicsMan;
|
|
};
|
|
}
|
|
|
|
#endif // !SABA_MODEL_MMD_PMDMODEL_H_
|