본문으로 바로가기

201019_DX3D_MapEdit.zip
7.08MB

 

 

더보기

1. TerrainEdit Scene

#pragma once

class TerrainEditorScene : public Scene
{
public:
	struct ObjectData
	{
		Vector3 position;
		Vector3 rotation;
		Vector3 scale{1.0f, 1.0f, 1.0f};
	}objData;
	////////////////////////////////////
private:
	Terrain* terrain;
	//
	Vector3 pickingPos;
	//
	bool setCube;
	//
	bool setSphere;
	float sphereRadius;
	//
	vector<Sphere*> spheres;
	vector<Cube*> cubes;
	////////////////////////////////////
public:
	TerrainEditorScene();
	~TerrainEditorScene();

	virtual void Update() override;
	virtual void PreRender() override;
	virtual void Render() override;
	virtual void PostRender() override;
	//
	void Create();
	void CreateCube(ObjectData data);
	void CreateSphere(ObjectData data, float radius);
	void SetCube();
	void SetSphere();
	//
	void Save();
	void Load();
	//
	void Clear();
};
////////////////////////////////////////////////////////////////////////
#include "Framework.h"
#include "TerrainEditorScene.h"

TerrainEditorScene::TerrainEditorScene()
	:setCube(false), setSphere(false),
	sphereRadius(1.0f)
{
	terrain = new Terrain();
}

TerrainEditorScene::~TerrainEditorScene()
{
	for (auto cube : cubes)
		delete cube;
	cubes.clear();
	//
	for (auto sphere : spheres)
		delete sphere;
	spheres.clear();
	//
	delete terrain;
}

void TerrainEditorScene::Update()
{
	if (KEY_DOWN(VK_LBUTTON))
		if (terrain->ComputePicking(&pickingPos))
			Create();
	//
	terrain->Update();
	//
	for (auto cube : cubes)
		cube->Update();
	//
	for (auto sphere : spheres)
		sphere->Update();
}

void TerrainEditorScene::PreRender()
{
}

void TerrainEditorScene::Render()
{
	terrain->Render();
	//
	for (auto cube : cubes)
		cube->Render();
	//
	for (auto sphere : spheres)
		sphere->Render();
}

void TerrainEditorScene::PostRender()
{
	ImGui::Text("Picking : %.1f, %.1f, %.1f", pickingPos.x, pickingPos.y, pickingPos.z);
	//
	ImGui::Checkbox("cube", (bool*)&setCube);
	ImGui::Checkbox("sphere", (bool*)&setSphere);
	//
	ImGui::SliderFloat3("Rotation", (float*)&objData.rotation, 0, 2.0f * XM_PI);
	ImGui::SliderFloat3("Scale", (float*)&objData.scale, 0, 10.0f);
	ImGui::SliderFloat("SphereRadius", &sphereRadius, 0, 10.0f);
	//
	if (ImGui::Button("SetCube", { 64.0f, 32.0f }))
		SetCube();
	if (ImGui::Button("SetSphere", { 64.0f, 32.0f }))
		SetSphere();
	if (ImGui::Button("Save", { 64.0f, 32.0f }))
		Save();
	if (ImGui::Button("Load", { 64.0f, 32.0f }))
		Load();
	if (ImGui::Button("Clear", { 64.0f, 32.0f }))
		Clear();
}

void TerrainEditorScene::SetCube()
{
	setCube = true;
	setSphere = false;
}

void TerrainEditorScene::SetSphere()
{
	setSphere = true;
	setCube = false;
}

void TerrainEditorScene::Save()
{
	/* Create Filesystem */
	HANDLE file;
	DWORD write; // unsigned long
	file = CreateFile(L"MapFiles/mapData.map", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
	/* Save Cubes */
	{
		int count = cubes.size();
		V(WriteFile(file, &count, sizeof(int), &write, nullptr));
		//
		if (count != 0)
		{
			ObjectData data;
			for (int i = 0; i < count; ++i)
			{
				data.position = cubes[i]->position;
				data.rotation = cubes[i]->rotation;
				data.scale = cubes[i]->scale;
				V(WriteFile(file, &data, sizeof(ObjectData), &write, nullptr));
			}
		}
	}
	/* Save Spheres */
	{
		int count = spheres.size();
		V(WriteFile(file, &count, sizeof(int), &write, nullptr));
		//
		if (count != 0)
		{
			ObjectData data;
			float radius;
			for (int i = 0; i < count; ++i)
			{
				data.position = spheres[i]->position;
				data.rotation = spheres[i]->rotation;
				data.scale = spheres[i]->scale;
				V(WriteFile(file, &data, sizeof(ObjectData), &write, nullptr));
				radius = spheres[i]->GetRadius();
				V(WriteFile(file, &radius, sizeof(float), &write, nullptr));
			}
		}
	}
	/* Save End */
	CloseHandle(file);
}

void TerrainEditorScene::Load()
{
	/* Reset vector<Cube* & Sphere*> */
	for (auto cube : cubes)
		delete cube;
	cubes.clear();
	//
	for (auto sphere : spheres)
		delete sphere;
	spheres.clear();
	/* Create Filesystem */
	HANDLE file;
	DWORD read; // unsigned long
	file = CreateFile(L"MapFiles/mapData.map", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
	/* Load Cube Data */
	{
		int count{};
		V(ReadFile(file, &count, sizeof(int), &read, nullptr));
		//
		if (count != 0)
		{
			ObjectData data;
			for (int i = 0; i < count; ++i)
			{
				V(ReadFile(file, &data, sizeof(ObjectData), &read, nullptr));
				CreateCube(data);
			}
		}
	}
	/* Load Sphere Data */
	{
		int count{};
		V(ReadFile(file, &count, sizeof(int), &read, nullptr));
		//
		if (count != 0)
		{
			ObjectData data;
			float radius = 1.0f;
			for (int i = 0; i < count; ++i)
			{
				V(ReadFile(file, &data, sizeof(ObjectData), &read, nullptr));
				V(ReadFile(file, &radius, sizeof(float), &read, nullptr));
				CreateSphere(data, radius);
			}
		}
	}
	/* Load End */
	CloseHandle(file);
}

void TerrainEditorScene::Clear()
{
	for (auto cube : cubes)
		delete cube;
	cubes.clear();
	//
	for (auto sphere : spheres)
		delete sphere;
	spheres.clear();
}

void TerrainEditorScene::Create()
{
	if (setCube == false && setSphere == false) return;
	if (setCube == true && setSphere == true) return;
	//
	if (setCube)
	{
		Vector3 offset{ 0, 1.0f, 0 };
		objData.position = pickingPos + offset;
		CreateCube(objData);
	}
	//
	else if (setSphere)
	{
		Vector3 offset{ 0, sphereRadius, 0 };
		objData.position = pickingPos + offset;
		CreateSphere(objData, sphereRadius);
	}
	//
	else return;
}

void TerrainEditorScene::CreateCube(ObjectData data)
{
	Cube* cube = new Cube(L"NormalMapping");
	cube->position = data.position;
	cube->rotation = data.rotation;
	cube->scale = data.scale;
	cube->GetMaterial()->SetDiffuseMap(L"Textures/Landscape/Fieldstone_DM.tga");
	cube->GetMaterial()->SetSpecularMap(L"Textures/Landscape/Fieldstone_SM.tga");
	cube->GetMaterial()->SetNormalMap(L"Textures/Landscape/Fieldstone_NM.tga");
	cubes.emplace_back(cube);
}

void TerrainEditorScene::CreateSphere(ObjectData data, float radius)
{
	Sphere* sphere = new Sphere(L"NormalMapping", radius);
	sphere->position = data.position;
	sphere->rotation = data.rotation;
	sphere->scale = data.scale;
	sphere->GetMaterial()->SetDiffuseMap(L"Textures/Landscape/Fieldstone_DM.tga");
	sphere->GetMaterial()->SetSpecularMap(L"Textures/Landscape/Fieldstone_SM.tga");
	sphere->GetMaterial()->SetNormalMap(L"Textures/Landscape/Fieldstone_NM.tga");
	spheres.emplace_back(sphere);
}

 

'DX11 3D Game Programming' 카테고리의 다른 글

2020_1021 Terrain Edit ( Texture Splatting )  (0) 2020.10.21
2020_1020 Terrain Edit ( Terrain Brush )  (0) 2020.10.20
2020_1015 Light - Diffuse & Specular  (0) 2020.10.15
2020_1014 Sphere  (0) 2020.10.14
2020_1008 SolarSystem  (0) 2020.10.12