응애맘마조

230621 강의 본문

공부/3D강의

230621 강의

TH.Wert 2023. 6. 21. 22:24

Assimp에 대해서 강의를 했었습니다. 이걸로 이제 본인이 원하는 모델을 로드할 수 있게 되었고 로드 목적 말고는 사용하지 않습니다.

#pragma once

class Main : public Scene
{
private:
	Camera*				Cam;
	Grid*				grid;
	Actor*				temp;
	string				file;
    
	Assimp::Importer	importer;
	const aiScene*		scene;
public:
	Main();
	~Main();
	virtual void Init() override;
	virtual void Release() override;
	virtual void Update() override;
	virtual void LateUpdate() override;
	virtual void Render() override;
	virtual void PreRender() override;
	virtual void ResizeScreen() override;
}
#include "stdafx.h"
#include "Main.h"

Main::Main()
{
}

Main::~Main()
{
}

void Main::Init()
{
	Cam = Camera::Create();
	Cam->LoadFile("Cam.xml");
	Camera::main = Cam;
	Cam->width = App.GetWidth();
	Cam->height = App.GetHeight();
	Cam->viewport.width = App.GetWidth();
	Cam->viewport.height = App.GetHeight();

	grid = Grid::Create();

	temp = Actor::Create();
}

void Main::Release()
{
}

void Main::Update()
{
	ImGui::Begin("Hierarchy");
	Cam->RenderHierarchy();
	temp->RenderHierarchy();
	grid->RenderHierarchy();
	ImGui::End();

	if (GUI->FileImGui("ModelImporter", "ModelImporter",
		".fbx,.obj,.x", "../Assets"))
	{
		file = ImGuiFileDialog::Instance()->GetCurrentFileName();
		string path = "../Assets/" + file;

		importer.SetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, false);
		scene = importer.ReadFile
		(
			path,
			aiProcess_ConvertToLeftHanded
			| aiProcess_Triangulate
			| aiProcess_GenUVCoords
			| aiProcess_GenNormals
			| aiProcess_CalcTangentSpace
		);
		assert(scene != NULL and "Import Error");

		importer.FreeScene();

		//루트 노드에 담겨있는 메쉬 갯수만큼 반복
		for (int i = 0; i < scene->mRootNode->mNumMeshes; i++)
		{
			int index = scene->mRootNode->mMeshes[i];
			aiMesh* mesh = scene->mMeshes[index];
			aiMaterial* mtl
				= scene->mMaterials[mesh->mMaterialIndex];
			for (int j = 0; j < mesh->mNumVertices; j++)
			{
				//텍스쳐 좌표가 있다면
				if (mesh->HasTextureCoords(0))
				{
					mesh->mTextureCoords[0][j];
				}
				if (mesh->HasNormals())
				{
					mesh->mNormals[j];
				}
				if (mesh->HasPositions())
				{
					mesh->mVertices[j];
				}
			}
			
			for (int j = 0; j < mesh->mNumFaces; j++)
			{
				for (int k = 0; k < mesh->mFaces[j].mNumIndices; k++)
				{
					mesh->mFaces[j].mIndices[k];
				}
			}
		}
	}
	Camera::ControlMainCam();
	Cam->Update();
	grid->Update();
	temp->Update();
}

void Main::LateUpdate()
{
}

void Main::PreRender()
{
}

void Main::Render()
{
	Cam->Set();
	grid->Render();
	temp->Render();
}

void Main::ResizeScreen()
{
}

int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR param, int command)
{
    App.SetAppName(L"ObjLoader");
    App.SetInstance(instance);
    WIN->Create();
    D3D->Create();
    Main * main = new Main();
    main->Init();
    
    int wParam = (int)WIN->Run(main);
    
    main->Release();
    SafeDelete(main);
    D3D->DeleteSingleton();
    WIN->DeleteSingleton();
    
    return wParam;
}

Main의 헤더와 cpp 파일입니다.

아직 현재의 코드로는 로드할 수 없습니다. 나머지는 과제로 내주셔서 과제에서 잇겠습니다.

 

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

230623 강의  (0) 2023.06.23
230622 강의  (0) 2023.06.22
230620 강의  (0) 2023.06.20
230616 강의  (0) 2023.06.20
230614 강의  (0) 2023.06.14
Comments