図1302a
このサンプルはシンプルな3D表現のサンプルです。1、基本色(PNTフォーマットは法線ライティング)にデフューズ(拡散光)を掛ける。 2、1にエミッシブ色を足す 3、PNTフォーマットはスペキュラーを足す 4、3を基本色とし、テクスチャがある場合はサンプリングした値に3を掛ける。 5、影がある場合は影要素を掛ける
図1302b
この中で頂点シェーダとピクセルシェーダは必須なシェーダです。
void PcSphere::OnCreate() {
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(Vec3(1.0f, 1.0f, 1.0f));
Quat qt;
qt.identity();
ptrTrans->SetQuaternion(qt);
ptrTrans->SetPosition(m_StartPos);
//描画コンポーネント
auto ptrDraw = AddComponent<PCStaticDraw>();
vector<VertexPositionNormalTexture> vertices;
vector<VertexPositionColor> new_vertices;
vector<uint16_t> indices;
MeshUtill::CreateSphere(1.0f, 18, vertices, indices);
for (size_t i = 0; i < vertices.size(); i++) {
VertexPositionColor newV;
newV.position = vertices[i].position;
newV.color = Col4(
newV.position.x * 2.0f,
newV.position.y * 2.0f,
newV.position.z * 2.0f,
1.0f);
new_vertices.push_back(newV);
}
ptrDraw->CreateOriginalMesh(new_vertices, indices);
ptrDraw->SetOriginalMeshUse(true);
//影をつける
auto ptrShadow = AddComponent<Shadowmap>();
ptrShadow->SetMeshResource(ptrDraw->GetOriginalMeshResource());
}
ptrDraw->CreateOriginalMesh(new_vertices, indices);
ptrDraw->SetOriginalMeshUse(true);
//影をつける
auto ptrShadow = AddComponent<Shadowmap>();
ptrShadow->SetMeshResource(ptrDraw->GetOriginalMeshResource());
//--------------------------------------------------------------------------------------
///頂点を変更する行動クラス
//--------------------------------------------------------------------------------------
class VertexBehavior : public Behavior {
float m_TotalTime;
public:
//--------------------------------------------------------------------------------------
/*!
@brief コンストラクタ
@param[in] GameObjectPtr このコンポーネントを所持するゲームオブジェクト
*/
//--------------------------------------------------------------------------------------
VertexBehavior(const shared_ptr<GameObject>& GameObjectPtr) :
Behavior(GameObjectPtr),
m_TotalTime(0)
{}
//--------------------------------------------------------------------------------------
/*!
@brief デストラクタ
*/
//--------------------------------------------------------------------------------------
virtual ~VertexBehavior() {}
//--------------------------------------------------------------------------------------
/*!
@brief 伸び縮みする
@tparam T 頂点の型
@return なし
*/
//--------------------------------------------------------------------------------------
template<typename T, typename T2>
void ExpandAndContract() {
float elapsedTime = App::GetApp()->GetElapsedTime();
m_TotalTime += elapsedTime;
if (m_TotalTime >= XM_2PI) {
m_TotalTime = 0;
}
auto ptrDraw = GetGameObject()->GetDynamicComponent<T2>();
const vector<T>& backupVec = ptrDraw->GetOriginalMeshResource()->GetBackupVerteces<T>();
vector<T> newVec;
for (auto& v : backupVec) {
T newV;
newV = v;
auto len = (sin(m_TotalTime) * 0.5f) + 1.0f;
newV.position.x *= len;
newV.position.z *= len;
newVec.push_back(newV);
}
ptrDraw->UpdateVertices(newVec);
}
};
auto ptrDraw = GetGameObject()->GetDynamicComponent<T2>();
void PcSphere::OnUpdate() {
auto beh = GetBehavior<VertexBehavior>();
beh->ExpandAndContract<VertexPositionColor, PCStaticDraw>();
}
//初期化
void PntSpSphere::OnCreate() {
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(Vec3(1.0f, 1.0f, 1.0f));
Quat qt;
qt.identity();
ptrTrans->SetQuaternion(qt);
ptrTrans->SetPosition(m_StartPos);
//影をつける
auto ptrShadow = AddComponent<Shadowmap>();
ptrShadow->SetMeshResource(L"DEFAULT_SPHERE");
//描画コンポーネント
auto ptrDraw = AddComponent<PNTStaticDraw>();
ptrDraw->SetSpecular(Col4(1.0f, 1.0f, 1.0f, 1.0f));
ptrDraw->SetMeshResource(L"DEFAULT_SPHERE");
if (m_TextureUse) {
ptrDraw->SetTextureResource(L"SKY_TX");
}
}
void Scene::CreateResourses() {
wstring dataDir;
//サンプルのためアセットディレクトリを取得
App::GetApp()->GetAssetsDirectory(dataDir);
//各ゲームは以下のようにデータディレクトリを取得すべき
//App::GetApp()->GetDataDirectory(dataDir);
//中略
auto modelMesh = MeshResource::CreateBoneModelMesh(dataDir, L"Chara_R.bmf");
App::GetApp()->RegisterResource(L"Chara_R_MESH", modelMesh);
auto staticModelMesh = MeshResource::CreateStaticModelMesh(dataDir, L"Character_01.bmf");
App::GetApp()->RegisterResource(L"MODEL_MESH", staticModelMesh);
//スタティックモデル(マルチメッシュ)の通常リソース
auto staticMultiModelMesh = MultiMeshResource::CreateStaticModelMultiMesh(dataDir, L"ObjectOnly.bmf");
App::GetApp()->RegisterResource(L"ObjectOnly_MESH", staticMultiModelMesh);
//ボーンモデル(マルチメッシュ)の通常リソース
auto multiModelMesh = MultiMeshResource::CreateBoneModelMultiMesh(dataDir, L"Object_WalkAnimation.bmf");
App::GetApp()->RegisterResource(L"Object_WalkAnimation_MESH", multiModelMesh);
}
//初期化
void BoneChara::OnCreate() {
//初期位置などの設定
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(0.5f, 0.5f, 0.5f);
ptrTrans->SetRotation(0.0f, 0.0f, 0.0f);
ptrTrans->SetPosition(m_StartPos);
Mat4x4 spanMat; // モデルとトランスフォームの間の差分行列
spanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ptrShadow = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ptrShadow->SetMeshResource(L"Chara_R_MESH");
ptrShadow->SetMeshToTransformMatrix(spanMat);
//描画コンポーネントの設定
auto ptrDraw = AddComponent<PNTBoneModelDraw>();
//描画するメッシュを設定
ptrDraw->SetMeshResource(L"Chara_R_MESH");
ptrDraw->SetMeshToTransformMatrix(spanMat);
ptrDraw->AddAnimation(L"Default", 0, 50, true, 20.0f);
ptrDraw->ChangeCurrentAnimation(L"Default");
//透明処理
SetAlphaActive(true);
}
//更新
void BoneChara::OnUpdate() {
//アニメーションを更新する
auto ptrDraw = GetComponent<PNTBoneModelDraw>();
float elapsedTime = App::GetApp()->GetElapsedTime();
ptrDraw->UpdateAnimation(elapsedTime);
}
//初期化
void BoneMultiMeshChara::OnCreate() {
//初期位置などの設定
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(0.5f, 0.5f, 0.5f);
ptrTrans->SetRotation(0.0f, 0.0f, 0.0f);
ptrTrans->SetPosition(m_StartPos);
Mat4x4 spanMat; // モデルとトランスフォームの間の差分行列
spanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ptrShadow = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ptrShadow->SetMultiMeshResource(L"Object_WalkAnimation_MESH");
ptrShadow->SetMeshToTransformMatrix(spanMat);
//描画コンポーネントの設定
auto ptrDraw = AddComponent<PNTBoneModelDraw>();
//描画するメッシュを設定
ptrDraw->SetMultiMeshResource(L"Object_WalkAnimation_MESH");
ptrDraw->SetSamplerState(SamplerState::LinearWrap);
ptrDraw->SetMeshToTransformMatrix(spanMat);
ptrDraw->AddAnimation(L"Default", 0, 30, true, 10.0f);
ptrDraw->ChangeCurrentAnimation(L"Default");
}
//更新
void BoneMultiMeshChara::OnUpdate() {
auto ptrDraw = GetComponent<PNTBoneModelDraw>();
float elapsedTime = App::GetApp()->GetElapsedTime();
ptrDraw->UpdateAnimation(elapsedTime);
}
//初期化
void StaticChara::OnCreate() {
//初期位置などの設定
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(0.5f, 0.5f, 0.5f);
ptrTrans->SetRotation(0.0f, 0.0f, 0.0f);
ptrTrans->SetPosition(m_StartPos);
Mat4x4 spanMat; // モデルとトランスフォームの間の差分行列
spanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ptrShadow = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ptrShadow->SetMeshResource(L"MODEL_MESH");
ptrShadow->SetMeshToTransformMatrix(spanMat);
auto ptrDraw = AddComponent<PNTStaticModelDraw>();
ptrDraw->SetMeshResource(L"MODEL_MESH");
ptrDraw->SetMeshToTransformMatrix(spanMat);
}
//初期化
void StaticMultiMeshChara::OnCreate() {
//初期位置などの設定
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(0.5f, 0.5f, 0.5f);
ptrTrans->SetRotation(0.0f, 0.0f, 0.0f);
ptrTrans->SetPosition(m_StartPos);
Mat4x4 spanMat; // モデルとトランスフォームの間の差分行列
spanMat.affineTransformation(
Vec3(1.0f, 1.0f, 1.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f),
Vec3(0.0f, 0.0f, 0.0f)
);
//影をつける(シャドウマップを描画する)
auto ptrShadow = AddComponent<Shadowmap>();
//影の形(メッシュ)を設定
ptrShadow->SetMultiMeshResource(L"ObjectOnly_MESH");SetMeshToTransformMatrix(spanMat);
auto ptrDraw = AddComponent<PNTStaticModelDraw>();
ptrDraw->SetMultiMeshResource(L"ObjectOnly_MESH");
ptrDraw->SetMeshToTransformMatrix(spanMat);
}