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 |