-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChapter09Sample02.cpp
106 lines (89 loc) · 4.35 KB
/
Chapter09Sample02.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#pragma warning(disable : 26451)
#define _CRT_SECURE_NO_WARNINGS
#include "Chapter09Sample02.h"
#include "GLTFLoader.h"
#include "Uniform.h"
#include "glad.h"
void Chapter09Sample02::Initialize() {
cgltf_data* gltf = LoadGLTFFile("Resources/Woman.gltf");
std::cout << gltf->meshes_count << std::endl;
mCPUMeshes = LoadMeshes(gltf);
mSkeleton = LoadSkeleton(gltf);
mClips = LoadAnimationClips(gltf);
FreeGLTFFile(gltf);
mGPUMeshes = mCPUMeshes;
for (unsigned int i = 0, size = (unsigned int)mGPUMeshes.size(); i < size; ++i) {
mGPUMeshes[i].UpdateOpenGLBuffers();
}
mStaticShader = new shader("Resources/staticVert.shader", "Resources/LitFrag.shader");
mSkinnedShader = new shader("Resources/SkinnedVertex.shader", "Resources/LitFrag.shader");
mDiffuseTexture = new Texture("Resources/Woman.png");
mGPUAnimInfo.mAnimatedPose = mSkeleton.GetRestPose();
mGPUAnimInfo.mPosePalette.resize(mSkeleton.GetRestPose().Size());
mCPUAnimInfo.mAnimatedPose = mSkeleton.GetRestPose();
mCPUAnimInfo.mPosePalette.resize(mSkeleton.GetRestPose().Size());
mGPUAnimInfo.mModel.position = vec3(-2, 0, 0);
mCPUAnimInfo.mModel.position = vec3(2, 0, 0);
unsigned int numUIClips = (unsigned int)mClips.size();
for (unsigned int i = 0; i < numUIClips; ++i) {
if (mClips[i].GetName() == "Walking") {
mCPUAnimInfo.mClip = i;
}
else if (mClips[i].GetName() == "Running") {
mGPUAnimInfo.mClip = i;
}
}
}
void Chapter09Sample02::Update(float deltaTime) {
mCPUAnimInfo.mPlayback = mClips[mCPUAnimInfo.mClip].Sample(mCPUAnimInfo.mAnimatedPose, mCPUAnimInfo.mPlayback + deltaTime);
mGPUAnimInfo.mPlayback = mClips[mGPUAnimInfo.mClip].Sample(mGPUAnimInfo.mAnimatedPose, mGPUAnimInfo.mPlayback + deltaTime);
for (unsigned int i = 0, size = (unsigned int)mCPUMeshes.size(); i < size; ++i) {
mCPUMeshes[i].CPUSkin(mSkeleton, mCPUAnimInfo.mAnimatedPose);
}
mGPUAnimInfo.mAnimatedPose.GetMatrixPalette(mGPUAnimInfo.mPosePalette);
}
void Chapter09Sample02::Render(float inAspectRatio) {
mat4 projection = perspective(60.0f, inAspectRatio, 0.01f, 1000.0f);
mat4 view = lookAt(vec3(0, 5, 7), vec3(0, 3, 0), vec3(0, 1, 0));
mat4 model;
// CPU Skinned Mesh
model = transformToMat4(mCPUAnimInfo.mModel);
mStaticShader->Bind();
Uniform<mat4>::Set(mStaticShader->GetUniform("model"), model);
Uniform<mat4>::Set(mStaticShader->GetUniform("view"), view);
Uniform<mat4>::Set(mStaticShader->GetUniform("projection"), projection);
Uniform<vec3>::Set(mStaticShader->GetUniform("light"), vec3(1, 1, 1));
mDiffuseTexture->Set(mStaticShader->GetUniform("tex0"), 0);
for (unsigned int i = 0, size = (unsigned int)mCPUMeshes.size(); i < size; ++i) {
mCPUMeshes[i].Bind(mStaticShader->GetAttribute("position"), mStaticShader->GetAttribute("normal"), mStaticShader->GetAttribute("texCoord"), -1, -1);
mCPUMeshes[i].Draw();
mCPUMeshes[i].UnBind(mStaticShader->GetAttribute("position"), mStaticShader->GetAttribute("normal"), mStaticShader->GetAttribute("texCoord"), -1, -1);
}
mDiffuseTexture->UnSet(0);
mStaticShader->UnBind();
// GPU Skinned Mesh
model = transformToMat4(mGPUAnimInfo.mModel);
mSkinnedShader->Bind();
Uniform<mat4>::Set(mSkinnedShader->GetUniform("model"), model);
Uniform<mat4>::Set(mSkinnedShader->GetUniform("view"), view);
Uniform<mat4>::Set(mSkinnedShader->GetUniform("projection"), projection);
Uniform<vec3>::Set(mSkinnedShader->GetUniform("light"), vec3(1, 1, 1));
Uniform<mat4>::Set(mSkinnedShader->GetUniform("pose"), mGPUAnimInfo.mPosePalette);
Uniform<mat4>::Set(mSkinnedShader->GetUniform("invBindPose"), mSkeleton.GetInvBindPose());
mDiffuseTexture->Set(mSkinnedShader->GetUniform("tex0"), 0);
for (unsigned int i = 0, size = (unsigned int)mGPUMeshes.size(); i < size; ++i) {
mGPUMeshes[i].Bind(mSkinnedShader->GetAttribute("position"), mSkinnedShader->GetAttribute("normal"), mSkinnedShader->GetAttribute("texCoord"), mSkinnedShader->GetAttribute("weights"), mSkinnedShader->GetAttribute("joints"));
mGPUMeshes[i].Draw();
mGPUMeshes[i].UnBind(mSkinnedShader->GetAttribute("position"), mSkinnedShader->GetAttribute("normal"), mSkinnedShader->GetAttribute("texCoord"), mSkinnedShader->GetAttribute("weights"), mSkinnedShader->GetAttribute("joints"));
}
mDiffuseTexture->UnSet(0);
mSkinnedShader->UnBind();
}
void Chapter09Sample02::Shutdown() {
delete mStaticShader;
delete mDiffuseTexture;
delete mSkinnedShader;
mClips.clear();
mCPUMeshes.clear();
mGPUMeshes.clear();
}