AnimEngine
SkinnedMeshEntity.hpp
1 #pragma once
2 #ifndef KJY_ANIM_ENGINE_SKINNED_MESH_HPP_
3 #define KJY_ANIM_ENGINE_SKINNED_MESH_HPP_
4 
5 #include <vector>
6 #include <glm/glm.hpp>
7 #include <OOOGL/MidLevel/Geometry.hpp>
8 #include "EntitiesBase.hpp"
9 #include "MeshEntity.hpp"
10 #include "Skeleton.hpp"
11 #include <components/attachable/SkeletonAnimator.hpp>
12 
13 using namespace OOOGL;
14 
15 /* A `TriangleMesh` with an added vertex weights buffer.
16  * Attributes are layed out as follows:
17  * 0: vec3 vertex position
18  * 1: vec3 vertex normals
19  * 2: vec2 texture coordinates
20  * 3: ivec4 Vertex joint assignments
21  * 4: vec4 Vertex weights
22 */
24  public:
27  const std::vector<glm::vec3>& vertices, const std::vector<GLuint> elements,
28  const std::vector<glm::vec3>& normals, const std::vector<glm::vec2>& texcoords,
29  const std::vector<glm::uvec4>& joints, const std::vector<glm::vec4>& weights, bool skip_gpu_upload = false
30  );
31 
32  virtual const std::vector<glm::uvec4>& getJoints() const {return(cpu_joints_buffer_);}
33  virtual std::vector<glm::uvec4>& getMutableJoints() {return(cpu_joints_buffer_); sync_status_ = GpuSyncStatus::GPU_STALE;}
34  virtual void replaceJoints(const std::vector<glm::uvec4>& new_buffer) {cpu_joints_buffer_ = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE;}
35 
36  virtual const std::vector<glm::vec4>& getVertexWeights() const {return(cpu_weights_buffer_);}
37  virtual std::vector<glm::vec4>& getMutableVertexWeights() {return(cpu_weights_buffer_); sync_status_ = GpuSyncStatus::GPU_STALE;}
38  virtual void replaceVertexWeights(const std::vector<glm::vec4>& new_buffer) {cpu_weights_buffer_ = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE;}
39 
40  ArrayBuffer vertex_joints_buffer;
41  ArrayBuffer vertex_weights_buffer;
42 
43  /* Leaving these public to avoid headache of writing accessors. It'll just be a warning if materials indices are nonsense */
44  std::vector<MaterialInterface*> materials;
45  std::vector<int> material_indices;
46 
47  protected:
48 
49  virtual void _uploadData() override;
50 
51  std::vector<glm::uvec4> cpu_joints_buffer_;
52  std::vector<glm::vec4> cpu_weights_buffer_;
53 };
54 
55 class SkinnedMeshEntity : public MeshEntity {
56  public:
57  virtual void draw(const MVPset& MVP, Program* shader = nullptr) override;
58  virtual bool canOverrideShader() const override {return(true);}
59  virtual bool requiresOverrideShader() const override {return(false);}
60  virtual const Pose& getPose() const override;
61  virtual Pose& getMutablePose();
62  virtual void setPose(const Pose& pose) override;
63  virtual void assignSkeleton(Skeleton* skeleton);
64  virtual size_t numBones() {return(_skeleton != nullptr ? _skeleton->numBones() : 0);}
65 
66  virtual void setAllAnimatorsTime(key_time_t time);
67  virtual void updatePoseFromAnimators();
68  virtual void updatePoseFromSingleAnimator(int index);
69 
70  std::vector<SkinnedTriangleMesh> geometry;
71  std::vector<SkinKeyframeAnimator> skin_animators;
72 
73  protected:
74  Skeleton* _skeleton = nullptr;
75 };
76 
77 #endif
Definition: SkinnedMeshEntity.hpp:23
Definition: Program.h:15
Definition: drawable.hpp:8
Definition: SkinnedMeshEntity.hpp:55
Definition: MeshEntity.hpp:14
Definition: Geometry.hpp:89
Definition: Pose.hpp:11
Definition: Core_Utilities.cpp:3
Definition: Buffers.hpp:106
Definition: Skeleton.hpp:72