Browse Source

starting to work at mc dungeons

meemknight 2 years ago
parent
commit
0e7acbc9f9

+ 3 - 1
Pika/gameplay/containers.h

@@ -20,6 +20,7 @@ Container *getContainer(const char* name, pika::memory::MemoryArena *memoryArena
 #include "pluggins/immageviewer.h"
 #include "pluggins/threeDEditor.h"
 #include "pluggins/pikatextEditor.h"
+#include "containers/minecraftDungeons/mcDungeonsEditor.h"
 
 #define PIKA_ALL_CONTAINERS() \
 	PIKA_DECLARE_CONTAINER(Gameplay) \
@@ -28,4 +29,5 @@ Container *getContainer(const char* name, pika::memory::MemoryArena *memoryArena
 	PIKA_DECLARE_CONTAINER(ThreeDEditor) \
 	PIKA_DECLARE_CONTAINER(PikaTextEditor) \
 	PIKA_DECLARE_CONTAINER(Mario) \
-	PIKA_DECLARE_CONTAINER(MarioEditor)
+	PIKA_DECLARE_CONTAINER(MarioEditor) \
+	PIKA_DECLARE_CONTAINER(McDungeonsEditor) 

+ 311 - 0
Pika/gameplay/containers/minecraftDungeons/mcDungeonsEditor.h

@@ -0,0 +1,311 @@
+#pragma once
+
+#include <gl2d/gl2d.h>
+#include <gl3d.h>
+#include <imgui.h>
+#include <baseContainer.h>
+#include <shortcutApi/shortcutApi.h>
+#include <pikaSizes.h>
+#include <imgui_spinner.h>
+#include <imfilebrowser.h>
+#include <engineLibraresSupport/engineGL3DSupport.h>
+
+
+
+struct McDungeonsEditor: public Container
+{
+
+
+	//todo user can request imgui ids; shortcut manager context; allocators
+	static ContainerStaticInfo containerInfo()
+	{
+		ContainerStaticInfo info = {};
+		info.defaultHeapMemorySize = pika::MB(1000); //todo option to use global allocator
+
+		info.extensionsSuported = {".gl3d"};
+
+		info.requestImguiFbo = true;
+		info.requestImguiIds = 1;
+
+		return info;
+	}
+
+
+	gl3d::Renderer3D renderer;
+	gl3d::Model model;
+	gl3d::Entity entity;
+	bool first = 1;
+
+	pika::gl3d::General3DEditor editor;
+
+	gl3d::Model createWorld(gl3d::Renderer3D &renderer, gl3d::Material material)
+	{
+	#pragma region data
+
+		float uv = 1;
+		
+		std::vector<float> vertexes;
+		std::vector<unsigned int> indices;
+
+		std::vector<unsigned int> ind = {0,   1,  2,  0,  2,  3};
+
+		std::vector<float> topVer = {
+				-1.0f, +1.0f, +1.0f, // 0
+				+0.0f, +1.0f, +0.0f, // Normal
+				0, 0,				 //uv
+
+				+1.0f, +1.0f, +1.0f, // 1
+				+0.0f, +1.0f, +0.0f, // Normal
+				1 * uv, 0,				 //uv
+
+				+1.0f, +1.0f, -1.0f, // 2
+				+0.0f, +1.0f, +0.0f, // Normal
+				1 * uv, 1 * uv,				 //uv
+
+				-1.0f, +1.0f, -1.0f, // 3
+				+0.0f, +1.0f, +0.0f, // Normal
+				0, 1 * uv,				 //uv
+		};
+
+		std::vector<float> backVer = {
+			-1.0f, +1.0f, -1.0f, // 4
+				 0.0f, +0.0f, -1.0f, // Normal
+				 0, 1 * uv,				 //uv
+
+				+1.0f, +1.0f, -1.0f, // 5
+				 0.0f, +0.0f, -1.0f, // Normal
+				 1 * uv, 1 * uv,				 //uv
+
+				 +1.0f, -1.0f, -1.0f, // 6
+				 0.0f, +0.0f, -1.0f, // Normal
+				 1 * uv, 0,				 //uv
+
+				-1.0f, -1.0f, -1.0f, // 7
+				 0.0f, +0.0f, -1.0f, // Normal
+				 0, 0,				 //uv
+		};
+
+		std::vector<float> rightVer = {
+			+1.0f, +1.0f, -1.0f, // 8
+				+1.0f, +0.0f, +0.0f, // Normal
+				1 * uv, 0,				 //uv
+
+				+1.0f, +1.0f, +1.0f, // 9
+				+1.0f, +0.0f, +0.0f, // Normal
+				1 * uv, 1 * uv,				 //uv
+
+				+1.0f, -1.0f, +1.0f, // 10
+				+1.0f, +0.0f, +0.0f, // Normal
+				0, 1 * uv,				 //uv
+
+				+1.0f, -1.0f, -1.0f, // 11
+				+1.0f, +0.0f, +0.0f, // Normal
+				0, 0,				 //uv
+		};
+
+		std::vector<float> leftVer = { 
+		-1.0f, +1.0f, +1.0f, // 12
+				-1.0f, +0.0f, +0.0f, // Normal
+				1 * uv, 1 * uv,				 //uv
+
+				-1.0f, +1.0f, -1.0f, // 13
+				-1.0f, +0.0f, +0.0f, // Normal
+				1 * uv, 0,				 //uv
+
+				-1.0f, -1.0f, -1.0f, // 14
+				-1.0f, +0.0f, +0.0f, // Normal
+				0, 0,				 //uv
+
+				-1.0f, -1.0f, +1.0f, // 15
+				-1.0f, +0.0f, +0.0f, // Normal
+				0, 1 * uv,				 //uv
+		};
+
+		std::vector<float> frontVer = {
+			+1.0f, +1.0f, +1.0f, // 16
+		+0.0f, +0.0f, +1.0f, // Normal
+		1 * uv, 1 * uv,				 //uv
+
+		-1.0f, +1.0f, +1.0f, // 17
+		+0.0f, +0.0f, +1.0f, // Normal
+		0, 1 * uv,				 //uv
+
+		-1.0f, -1.0f, +1.0f, // 18
+		+0.0f, +0.0f, +1.0f, // Normal
+		0, 0,				 //uv
+
+		+1.0f, -1.0f, +1.0f, // 19
+		+0.0f, +0.0f, +1.0f, // Normal
+		1 * uv, 0,				 //uv
+		};
+
+		std::vector<float> bottomVer = {
+			-1.0f, -1.0f, -1.0f, // 3
+		+0.0f, -1.0f, +0.0f, // Normal
+		0, 1 * uv,				 //uv
+
+		+1.0f, -1.0f, -1.0f, // 2
+		+0.0f, -1.0f, +0.0f, // Normal
+		1 * uv, 1 * uv,				 //uv
+
+		+1.0f, -1.0f, +1.0f, // 1
+		+0.0f, -1.0f, +0.0f, // Normal
+		1 * uv, 0,				 //uv
+
+		-1.0f, -1.0f, +1.0f, // 0
+		+0.0f, -1.0f, +0.0f, // Normal
+		0, 0,				 //uv
+		
+		};
+
+		auto addFace = [&](glm::vec3 pos, std::vector<float> &ver)
+		{
+			unsigned int currentIndexPadding = vertexes.size()/8;
+			for (auto i : ind) { indices.push_back(i + currentIndexPadding); }
+
+			for (auto v = 0; v < ver.size(); v++)
+			{
+				if (v % 8 == 0)
+				{
+					vertexes.push_back(ver[v]*0.5 + pos.x);
+				}
+				else if (v % 8 == 1)
+				{
+					vertexes.push_back(ver[v] * 0.5 + pos.y);
+				}
+				else if (v % 8 == 2)
+				{
+					vertexes.push_back(ver[v] * 0.5 + pos.z);
+				}
+				else
+				{
+					vertexes.push_back(ver[v]);
+				}
+			}
+		};
+
+		auto addTop = [&](glm::vec3 pos)
+		{
+			return addFace(pos, topVer);
+		};
+
+		auto addBottom = [&](glm::vec3 pos)
+		{
+			return addFace(pos, bottomVer);
+		};
+
+		auto addLeft = [&](glm::vec3 pos)
+		{
+			return addFace(pos, leftVer);
+		};
+
+		auto addRight = [&](glm::vec3 pos)
+		{
+			return addFace(pos, rightVer);
+		};
+
+		auto addFront = [&](glm::vec3 pos)
+		{
+			return addFace(pos, frontVer);
+		};
+
+		auto addBack = [&](glm::vec3 pos)
+		{
+			return addFace(pos, backVer);
+		};
+	#pragma endregion
+
+		addTop({0,0,0});
+		addTop({1,0,0});
+		addTop({2,0,0});
+
+		addTop({4,0,3});
+		addBottom({4,0,3});
+		addLeft({4,0,3});
+		addRight({4,0,3});
+		addFront({4,0,3});
+		addBack({4,0,3});
+
+
+		return renderer.createModelFromData(material, "cube",
+			vertexes.size(), vertexes.data(), indices.size(),
+			indices.data());
+	}
+
+	bool create(RequestedContainerInfo &requestedInfo, pika::StaticString<256> commandLineArgument)
+	{
+		//todo close function for containers
+		//todo check out why mouse don't work in outside window
+
+		renderer.setErrorCallback(&errorCallbackCustom, &requestedInfo);
+		renderer.fileOpener.userData = &requestedInfo;
+		renderer.fileOpener.readEntireFileBinaryCallback = readEntireFileBinaryCustom;
+		renderer.fileOpener.readEntireFileCallback = readEntireFileCustom;
+		renderer.fileOpener.fileExistsCallback = defaultFileExistsCustom;
+		
+		renderer.init(1, 1, PIKA_RESOURCES_PATH "BRDFintegrationMap.png", requestedInfo.requestedFBO.fbo);
+		
+		//renderer.skyBox = renderer.loadSkyBox(names);
+		//renderer.skyBox.color = {0.2,0.3,0.8};
+		renderer.skyBox = renderer.atmosfericScattering({0,1,0}, {0.2,0.2,0.5}, {0.6,0.2,0.1}, {},
+			false, 10);
+
+		//helmetModel = renderer.loadModel(PIKA_RESOURCES_PATH "helmet/helmet.obj");
+		//model = renderer.loadModel(PIKA_RESOURCES_PATH "rave.glb", 0.5);
+		auto defaultMat = renderer.loadMaterial(PIKA_RESOURCES_PATH "materials/rustedIron.mtl");
+
+		if (defaultMat.empty()) { return 0; }
+
+		model = createWorld(renderer, defaultMat[0]);
+
+		
+		gl3d::Transform t;
+		t.position = {0, -1, -4};
+		//t.rotation = {1.5, 0 , 0};
+		
+		entity = renderer.createEntity(model, t);
+
+		if (commandLineArgument.size() > 0)
+		{
+			editor.loadFromFile(renderer, commandLineArgument.to_string(), requestedInfo);
+		}
+
+
+		return true;
+	}
+
+	bool update(pika::Input input, pika::WindowState windowState,
+		RequestedContainerInfo &requestedInfo)
+	{
+
+		renderer.setErrorCallback(&errorCallbackCustom, &requestedInfo);
+		renderer.fileOpener.userData = &requestedInfo;
+		renderer.fileOpener.readEntireFileBinaryCallback = readEntireFileBinaryCustom;
+		renderer.fileOpener.readEntireFileCallback = readEntireFileCustom;
+		renderer.fileOpener.fileExistsCallback = defaultFileExistsCustom;
+	
+
+		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+		glEnable(GL_DEPTH_TEST);
+
+		
+
+		renderer.updateWindowMetrics(windowState.w, windowState.h);
+		renderer.camera.aspectRatio = (float)windowState.w / windowState.h; //todo do this in update
+
+			
+		editor.update(requestedInfo.requestedImguiIds, renderer, input, 4, requestedInfo);
+
+
+		renderer.render(input.deltaTime);
+		glDisable(GL_DEPTH_TEST);
+
+
+		return true;
+	}
+
+};
+
+//todo flag to clear screen from engine
+//todo error popup
+//todo error popup disable in release

+ 4 - 4
Pika/resources/logs.txt

@@ -1,4 +1,4 @@
-#2023-02-14 21:33:18: Created container: Gameplay
-#2023-02-14 21:33:21: Created container: ThreeDEditor
-#2023-02-14 21:33:35: Destroyed continer: Gameplay #1
-#2023-02-14 21:33:35: Destroyed continer: ThreeDEditor #2
+#2023-02-14 23:38:08: Created container: Gameplay
+#2023-02-14 23:38:12: Created container: McDungeonsEditor
+#2023-02-14 23:38:28: Destroyed continer: Gameplay #1
+#2023-02-14 23:38:28: Destroyed continer: McDungeonsEditor #2

+ 20 - 0
Pika/resources/materials/rustedIron.mtl

@@ -0,0 +1,20 @@
+# Blender MTL File: 'None'
+# Material Count: 1
+
+newmtl None
+Ns 198.039216
+Ka 0.000000 0.800000 0.000000
+Kd 1.000000 1.000000 1.000000
+Ks 1.000000 1.000000 1.000000
+Ke 0.000000 0.000000 0.000000
+Ni 1.000000
+d 1.000000
+Pm 0.9
+illum 2
+map_Kd rusted_iron/albedo.png 
+map_Kn rusted_iron/normal.png
+map_Pr rusted_iron/roughness.png
+map_Ao rusted_iron/ao.png
+map_Pm rusted_iron/metallic.png
+
+

BIN
Pika/resources/materials/rusted_iron/albedo.png


BIN
Pika/resources/materials/rusted_iron/ao.png


BIN
Pika/resources/materials/rusted_iron/metallic.png


BIN
Pika/resources/materials/rusted_iron/normal.png


BIN
Pika/resources/materials/rusted_iron/roughness.png


+ 66 - 8
Pika/thirdparty/gl3d/gl3d.cpp

@@ -35340,9 +35340,12 @@ namespace gl3d
 
 	void ModelData::clear(Renderer3D& renderer)
 	{
-		for (auto &i : createdMaterials)
+		for (auto m : models)
 		{
-			renderer.deleteMaterial(i);
+			if (m.ownMaterial)
+			{
+				renderer.deleteMaterial(m.material);
+			}
 		}
 
 		internalClear();
@@ -37054,6 +37057,54 @@ namespace gl3d
 		t.RMA_loadedTextures = 0;
 	}
 
+
+	Model Renderer3D::createModelFromData(Material material, std::string name,
+		size_t vertexCount, const float *vertices, size_t indexesCount,
+		const unsigned int *indexes, bool noTexture)
+	{
+
+		ModelData returnModel;
+		
+		//setup stuff
+		{
+			returnModel.createdMaterials.push_back(material);
+
+			GraphicModel gm;
+
+			gm.material = material;
+			gm.ownMaterial = false;
+			gm.name = name;
+			gm.hasBones = 0;
+
+			if (indexesCount == 0)
+			{
+				gm.loadFromComputedData(vertexCount * sizeof(float),
+					vertices,
+					0, nullptr, noTexture);
+			}
+			else
+			{
+				gm.loadFromComputedData(vertexCount * sizeof(float),
+					vertices,
+					indexesCount * sizeof(unsigned int), indexes, noTexture);
+			}
+	
+			char *c = new char[gm.name.size() + 1];
+			strcpy(c, gm.name.c_str());
+
+			returnModel.subModelsNames.push_back(c);
+			returnModel.models.push_back(gm);
+		}
+
+		int id = internal::generateNewIndex(internal.graphicModelsIndexes);
+		internal.graphicModelsIndexes.push_back(id);
+		internal.graphicModels.push_back(returnModel);
+		Model m;
+		m.id_ = id;
+		return m;
+	}
+
+
 	Model Renderer3D::loadModel(std::string path, float scale)
 	{
 
@@ -37100,7 +37151,6 @@ namespace gl3d
 			for (int i = 0; i < s; i++)
 			{
 				GraphicModel gm;
-				
 
 				int index = i;
 				//TextureDataForModel textureData = {};
@@ -37122,7 +37172,7 @@ namespace gl3d
 							mesh.Indices.size() * 4, &mesh.Indices[0]);
 					}
 				}
-				else //if(mesh.VerticesAnimations.size()) //todo empty model ?
+				else if(mesh.VerticesAnimations.size())
 				{
 					if (mesh.Indices.empty())
 					{
@@ -37137,6 +37187,11 @@ namespace gl3d
 							mesh.Indices.size() * 4, &mesh.Indices[0], false, true);
 					}
 				}
+				else
+				{
+					gl3dAssertComment(0, "Tried to load an emptty model");
+					return {0};
+				}
 				
 				gm.hasBones = mesh.hasBones;
 
@@ -37152,6 +37207,8 @@ namespace gl3d
 				gm.ownMaterial = true;
 
 				gm.name = model.loader.LoadedMeshes[i].MeshName;
+
+
 				char *c = new char[gm.name.size() + 1];
 				strcpy(c, gm.name.c_str());
 
@@ -37185,8 +37242,10 @@ namespace gl3d
 		}
 	}
 
-	void Renderer3D::deleteModel(Model &m) //todo delete created materials
+	void Renderer3D::deleteModel(Model &m) //todo check if delete created materials and internal stuff is good
 	{
+		clearModelData(m);
+
 		auto pos = internal.getModelIndex(m);
 		if (pos < 0)
 		{
@@ -37195,20 +37254,19 @@ namespace gl3d
 		}
 
 		internal.graphicModelsIndexes.erase(internal.graphicModelsIndexes.begin() + pos);
-		internal.graphicModels[pos].clear(*this);
 		internal.graphicModels.erase(internal.graphicModels.begin() + pos);
 
 		m.id_ = 0;
 	}
 
-	void Renderer3D::clearModelData(Model& m)
+	void Renderer3D::clearModelData(Model& m) 
 	{
 		auto pos = internal.getModelIndex(m);
 		if (pos < 0)
 		{
 			return;
 		}
-
+		
 		internal.graphicModels[pos].clear(*this);
 	}
 

+ 9 - 0
Pika/thirdparty/gl3d/gl3d.h

@@ -74,6 +74,10 @@ namespace gl3d
 	struct PBRTexture
 	{
 		Texture texture = {};  //rough metalness ambient oclusion
+
+		// (roughnessLoaded) -> 0b100
+		// (metallicLoaded)  -> 0b010
+		// (ambientLoaded)   -> 0b001
 		int RMA_loadedTextures = {};
 	};
 
@@ -34643,6 +34647,11 @@ namespace gl3d
 
 		//todo implement stuff here
 
+		//position 3, normal 3, optional texture 2
+		Model createModelFromData(Material material, std::string name, 
+			size_t vertexCount, const float *vertices, size_t indexesCount = 0,
+			const unsigned int *indexes = nullptr, bool noTexture = false);
+
 		Model loadModel(std::string path, float scale = 1);
 		bool isModel(Model& m);
 		void deleteModel(Model &m);