Beispiel #1
0
Results ModelClass::LoadMTL(String a_sFileName)
{
	String sAbsoluteRoute;
	sAbsoluteRoute = m_pSystem->m_pFolder->Root;
	sAbsoluteRoute += m_pSystem->m_pFolder->Data;
	sAbsoluteRoute += m_pSystem->m_pFolder->MOBJ;
	sAbsoluteRoute += a_sFileName;
	
	FileReaderClass reader;
	Results result = reader.ReadFile(sAbsoluteRoute);
	if(result != Results::ERROR_FREE)
		return result;

	reader.Rewind();
	int nMaterial = -1;
	while(reader.ReadNextLine() != Results::DONE)
	{
		char* sTemp = new char[reader.m_sLine.size() +1];
		String sWord = GetFirstWord(reader.m_sLine);

		if(sWord == "newmtl")
		{
			sscanf_s(reader.m_sLine.c_str(), "newmtl %s", sTemp, reader.m_sLine.size());
			String sTempMaterial = m_sModelName + "\\" + sTemp;
			nMaterial = m_pMaterialManager->AddMaterial(sTempMaterial);
		}
		else if(sWord == "map_Kd")
		{
			sscanf_s(reader.m_sLine.c_str(), "map_Kd %s", sTemp, reader.m_sLine.size());
			if(nMaterial > -1)
				m_pMaterialManager->m_vMaterial[nMaterial]->LoadDiffuse(static_cast<String>(sTemp));
		}

		delete[] sTemp;
	}

	return ERROR_FREE;
}
void ApplicationClass::ReadConfig(void)
{
	// Read the configuration file for this specific format
#pragma region READCONFIG
	if(m_bForceNewConfig == true)
	{
		WriteConfig();
		return;
	}

	//If we are forcing the changes
	String sRoot = m_pSystem->m_pFolder->GetFolderRoot();
	String App = m_pSystem->ApplicationName;
	App = sRoot + App + ".cfg";

	FileReaderClass reader;
	if(reader.ReadFile(App.c_str()) == MEErrors::ERROR_FILE_MISSING)
	{
		WriteConfig();
		return;
	}
	m_pSystem->m_RenderingContext = OPENGL3X;
	reader.Rewind();
	while(reader.ReadNextLine() == RUNNING)
	{
		String sWord = reader.GetFirstWord();

		int nLenght  = reader.m_sLine.length();
		char* zsTemp = new char[nLenght];
		
		if(sWord == "Fullscreen:")
		{
			int nValue;
			sscanf_s(reader.m_sLine.c_str(), "Fullscreen: %d", &nValue);
			if(nValue == 0)
				m_pSystem->SetWindowFullscreen(false);
			else
				m_pSystem->SetWindowFullscreen(true);
		}
		else if(sWord == "Borderless:")
		{
			int nValue;
			sscanf_s(reader.m_sLine.c_str(), "Borderless: %d", &nValue);
			if(nValue == 0)
				m_pSystem->SetWindowBorderless(false);
			else
				m_pSystem->SetWindowBorderless(true);
		}
		else if(sWord == "Resolution:")
		{
			int nValue1;
			int nValue2;
			sscanf_s(reader.m_sLine.c_str(), "Resolution: [ %d x %d ]", &nValue1,  &nValue2);
			m_pSystem->WindowWidth = nValue1;
			m_pSystem->WindowHeight = nValue2;
		}
		else if(sWord == "Ambient:")
		{
			float fValueX;
			float fValueY;
			float fValueZ;
			sscanf_s(reader.m_sLine.c_str(), "Ambient: [%f,%f,%f]", &fValueX, &fValueY, &fValueZ);
			m_pLightMngr->SetColor(vector3(fValueX, fValueY, fValueZ), 0);
		}
		else if(sWord == "AmbientPower:")
		{
			float fValue;
			sscanf_s(reader.m_sLine.c_str(), "AmbientPower: %f", &fValue);
			m_pLightMngr->SetIntensity(fValue, 0);
		}
		else if(sWord == "Data:")
		{
			sscanf_s(reader.m_sLine.c_str(), "Data: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderData( zsTemp );
		}
		else if(sWord == "3DS:")
		{
			sscanf_s(reader.m_sLine.c_str(), "3DS: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderM3DS( zsTemp );
		}
		else if(sWord == "BTO:")
		{
			sscanf_s(reader.m_sLine.c_str(), "BTO: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderMBTO( zsTemp );
		}
		else if(sWord == "FBX:")
		{
			sscanf_s(reader.m_sLine.c_str(), "FBX: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderMFBX( zsTemp );
		}
		else if(sWord == "OBJ:")
		{
			sscanf_s(reader.m_sLine.c_str(), "OBJ: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderMOBJ( zsTemp );
		}
		else if(sWord == "POM:")
		{
			sscanf_s(reader.m_sLine.c_str(), "POM: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderMPOM( zsTemp );
		}
		else if(sWord == "Level:")
		{
			sscanf_s(reader.m_sLine.c_str(), "Level: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderLVL( zsTemp );
		}
		else if(sWord == "Textures:")
		{
			sscanf_s(reader.m_sLine.c_str(), "Textures: %s", zsTemp, nLenght);
			m_pSystem->m_pFolder->SetFolderTextures( zsTemp );
		}

		delete[] zsTemp;
		zsTemp = nullptr;
	}
	reader.CloseFile();
#pragma endregion
}
void AppClass::ProcessKeyboard(void)
{
	bool bModifier = false;
	float fSpeed = 0.01f;

	int nMesh = m_pMeshMngr->IdentifyInstance(m_sSelectedObject);

#pragma region ON PRESS/RELEASE DEFINITION
	static bool	bLastF1 = false, bLastF2 = false, bLastF3 = false, bLastF4 = false, bLastF5 = false,
				bLastF6 = false, bLastF7 = false, bLastF8 = false, bLastF9 = false, bLastF10 = false,
				bLastEscape = false;
#define ON_KEY_PRESS_RELEASE(key, pressed_action, released_action){  \
			bool pressed = sf::Keyboard::isKeyPressed(sf::Keyboard::key);			\
			if(pressed){											\
				if(!bLast##key) pressed_action;}/*Just pressed? */\
			else if(bLast##key) released_action;/*Just released?*/\
			bLast##key = pressed; } //remember the state
#pragma endregion

#pragma region Modifiers
	if(sf::Keyboard::isKeyPressed(sf::Keyboard::LShift) || sf::Keyboard::isKeyPressed(sf::Keyboard::RShift))
		bModifier = true;
#pragma endregion

	if (sf::Keyboard::isKeyPressed(sf::Keyboard::R))
	{
		m_qArcBall = m_qOrientation = quaternion();
	}

	if (sf::Keyboard::isKeyPressed(sf::Keyboard::X))
	{
		if (!bModifier)
			m_qOrientation = m_qOrientation * quaternion(vector3(glm::radians(1.0f), 0.0f, 0.0f));
		else
			m_qOrientation = m_qOrientation * quaternion(vector3(glm::radians(-1.0f), 0.0f, 0.0f));
	}

	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Y))
	{
		if (!bModifier)
			m_qOrientation = m_qOrientation * quaternion(vector3(0.0f, glm::radians(1.0f), 0.0f));
		else
			m_qOrientation = m_qOrientation * quaternion(vector3(0.0f, glm::radians(-1.0f), 0.0f));
	}

	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
	{
		if (!bModifier)
			m_qOrientation = m_qOrientation * quaternion(vector3(0.0f, 0.0f, glm::radians(1.0f)));
		else
			m_qOrientation = m_qOrientation * quaternion(vector3(0.0f, 0.0f, glm::radians(-1.0f)));
	}

	//Model States
#pragma region Model States
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad0) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num0))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 0);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad1) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num1))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 1);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad2) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num2))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 2);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad3) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num3))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 3);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad4) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num4))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 4);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad5) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num5))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 5);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad6) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num6))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 6);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad7) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num7))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 7);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad8) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num8))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 8);
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::Numpad9) || sf::Keyboard::isKeyPressed(sf::Keyboard::Num9))
	{
		m_pMeshMngr->m_pModelMngr->SetNextState(m_sSelectedObject, 9);
	}
#pragma endregion

#pragma region Model Loading
	//Model Loading
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::F5))
	{
		FileReaderClass pFile;
		String sFileName = pFile.RetriveFileNameFromExplorer(L"OBJ Files (*.obj)\0*.obj\0ATO Files (*.ato)\0*.ato\0BTO Files (*.bto)\0*.bto\0", L"obj");
		if (sFileName != "")
		{
			bool bThreaded = m_pSystem->GetThreaded();
			m_pSystem->SetThreaded(false);

			m_pMeshMngr->m_pModelMngr->DeleteInstance();
			m_sSelectedObject = pFile.GetFileName(sFileName);
			m_pMeshMngr->LoadModel(sFileName, m_sSelectedObject, true);

			bool bTest = m_pMeshMngr->IsInstanceCreated(m_sSelectedObject);
			if (bTest)
			{
				BoundingObjectClass* pBO = m_pMeshMngr->GetBoundingObject(m_sSelectedObject);
				vector3 v3Centroid = pBO->GetCentroidGlobal();
				vector3 v3HalfWidth = pBO->GetHalfWidth();
				float fSize = v3HalfWidth.x;
				if (fSize < v3HalfWidth.y)
					fSize = v3HalfWidth.y;
				m_pCameraMngr->SetPositionAndView(v3Centroid + REAXISZ * 2.5f * fSize, v3Centroid);
			}

			m_pSystem->SetThreaded(bThreaded);
		}
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::F6))
	{
		if (m_sSelectedObject != "")
		{
			bool bThreaded = m_pSystem->GetThreaded();
			m_pSystem->SetThreaded(false);
			FileReaderClass pFile;
			String sFileName = pFile.IndicateFileNameOnExplorer(L"BTO Files (*.bto)\0*.bto\0ATO Files (*.ato)\0*.ato\0All Files (*.*)\0*.*\0", L"bto");
			if (sFileName != "")
			{
				m_pMeshMngr->SaveModel(sFileName, m_sSelectedObject, true);
			}

			m_pSystem->SetThreaded(bThreaded);
		}
	}
	if (sf::Keyboard::isKeyPressed(sf::Keyboard::F2))
	{
		m_pMeshMngr->m_pModelMngr->DeleteInstance(m_sSelectedObject);
		m_sSelectedObject = "";
	}
#pragma endregion

#pragma region Camera Positioning
	if(bModifier)
		fSpeed *= 10.0f;
	if(sf::Keyboard::isKeyPressed(sf::Keyboard::W))
		m_pCameraMngr->MoveForward(fSpeed);

	if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
		m_pCameraMngr->MoveForward(-fSpeed);
	
	if(sf::Keyboard::isKeyPressed(sf::Keyboard::A))
		m_pCameraMngr->MoveSideways(-fSpeed);

	if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
		m_pCameraMngr->MoveSideways(fSpeed);
	m_pCameraMngr->CalculateView();
#pragma endregion

#pragma region Other Actions
	ON_KEY_PRESS_RELEASE(Escape, NULL, PostMessage(m_pWindow->GetHandler(), WM_QUIT, NULL, NULL))
#pragma endregion
}
Beispiel #4
0
Results ModelClass::LoadOBJ(String a_sFileName)
{
	String sAbsoluteRoute;
	sAbsoluteRoute = m_pSystem->m_pFolder->Root;
	sAbsoluteRoute += m_pSystem->m_pFolder->Data;
	sAbsoluteRoute += m_pSystem->m_pFolder->MOBJ;
	sAbsoluteRoute += a_sFileName;

	m_sModelName = a_sFileName;
	//m_sModelName = "";
	//int nLenght = static_cast<int>(a_sFileName.size());
	//for(int i = 0; i < nLenght -4; i++)
	//{
	//	m_sModelName += a_sFileName[i];
	//}
	
	FileReaderClass reader;
	Results result = reader.ReadFile(sAbsoluteRoute);
	if(result != Results::ERROR_FREE)
		return result;

#ifdef DEBUG
	std::cout << "File read @: " << sAbsoluteRoute << std::endl;
#endif

	reader.Rewind();
	int nGroupIndex = -1;
	std::vector<vector3> vPosition; //Vector of Vertices
	std::vector<vector3> vNormal; //Vector of Normals
	std::vector<vector2> vUV; //vector of UVS
	int nMaterial = 0;

	while(reader.ReadNextLine() != DONE)
	{
		char* sTemp = new char[reader.m_sLine.size() +1];
		String sWord = GetFirstWord(reader.m_sLine);
#pragma region Vertex
		if(reader.m_sLine[0] == 'v')
		{
			float x = 0.0f, y = 0.0f, z = 0.0f;
			if(reader.m_sLine[1] == ' ')
			{
				sscanf_s(reader.m_sLine.c_str(), "v %f %f %f", &x, &y, &z);
				vPosition.push_back(vector3( x, y, z ));
			}
			else if(reader.m_sLine[1] == 't')
			{
				sscanf_s(reader.m_sLine.c_str(), "vt %f %f", &x, &y);
				vUV.push_back( vector2(x, y));
			}
			else if(reader.m_sLine[1] == 'n')
			{
				sscanf_s(reader.m_sLine.c_str(), "vn %f %f %f", &x, &y, &z);
				vNormal.push_back(vector3( x, y, z ));
			}
		}
#pragma endregion
#pragma region Group
		else if(reader.m_sLine[0] == 'g')
		{
			//Verify if new group or existing one
			//If different from current Group, change nGroup Index
			String sName;

			int nLineSize = static_cast<int>(reader.m_sLine.size()) + 1;
			char* zsTemp = new char[nLineSize];
			strcpy_s(zsTemp, nLineSize, reader.m_sLine.c_str());
			
			char seps[] = " ,\t\n";

			char *token, *next_token;

			token = strtok_s(zsTemp, seps, &next_token);
			//nEmptyGroups will count the number of Empty groups at the end of the group name
			int nemprtyGroups = 0;
			String sGroupNames;
			sGroupNames = "";
			while (token != NULL)//Go to next word
			{
				sName = token;
				if(sName[0] == 'N')
				{
					if(sName[1] == 'U')
					{
						if(sName[2] == 'L')
						{
							if(sName[3] == 'L')
							{
								if(sName[4] == '_')
								{
									//This is an Empty group
								}
								else
								{
									sGroupNames += sName;
									sGroupNames + " ";
								}
							}
							else
							{
								sGroupNames += sName;
								sGroupNames += " ";
							}
						}
						else
						{
							sGroupNames += sName;
							sGroupNames += " ";
						}
					}
					else
					{
						sGroupNames += sName;
						sGroupNames += " ";
					}
				}
				else
				{
					sGroupNames += sName;
					sGroupNames += " ";
				}
				if(token != NULL)
					token = strtok_s(NULL, seps, &next_token);
			}
			delete[] zsTemp;
			zsTemp = 0;
			zsTemp = new char [sGroupNames.size() +1];
			strcpy_s(zsTemp, sGroupNames.size() +1, sGroupNames.c_str());
			token = strtok_s(zsTemp, seps, &next_token);
			while (token != NULL)//Go to next word
			{
				sName = token;

				if(token != NULL)
					token = strtok_s(NULL, seps, &next_token);
			}
			delete[] zsTemp;
			zsTemp = 0;

			if(sName != "default")
			{
				int nTemp = -1;
				for(int n = 0; n < static_cast<int> (m_vShape.size()); ++n)
				{
					if(m_vShape[n].Name == sName)
					{
						nTemp = n;
						break;
					}
				}

				if(nTemp >= 0) //Did exist
				{
					nGroupIndex = nTemp;
				}
				else //New group
				{
					ShapeClass group;
					group.Name = sName;
					m_vShape.push_back(group);
					nGroupIndex = static_cast<int>(m_vShape.size()) -1;
				}
			}
		}
#pragma endregion
#pragma region Faces
		else if(reader.m_sLine[0] == 'f')
		{
			int nP1 = 0, nT1 = 0, nN1 = 0;
			int nP2 = 0, nT2 = 0, nN2 = 0;
			int nP3 = 0, nT3 = 0, nN3 = 0;

			sscanf_s( reader.m_sLine.c_str(), "f %d/%d/%d %d/%d/%d %d/%d/%d",
																				&nP1, &nT1, &nN1,
																				&nP2, &nT2, &nN2,
																				&nP3, &nT3, &nN3);
			m_vShape[nGroupIndex].AddVertexPosition(vPosition[nP1-1]);
			m_vShape[nGroupIndex].AddVertexPosition(vPosition[nP2-1]);
			m_vShape[nGroupIndex].AddVertexPosition(vPosition[nP3-1]);

			m_vShape[nGroupIndex].AddVertexColor(vector3(1.0f,1.0f,1.0f));
			m_vShape[nGroupIndex].AddVertexColor(vector3(1.0f,1.0f,1.0f));
			m_vShape[nGroupIndex].AddVertexColor(vector3(1.0f,1.0f,1.0f));

			m_vShape[nGroupIndex].AddVertexUV(vUV[nT1-1]);
			m_vShape[nGroupIndex].AddVertexUV(vUV[nT2-1]);
			m_vShape[nGroupIndex].AddVertexUV(vUV[nT3-1]);

			m_vShape[nGroupIndex].AddVertexNormal(vNormal[nN1-1]);
			m_vShape[nGroupIndex].AddVertexNormal(vNormal[nN2-1]);
			m_vShape[nGroupIndex].AddVertexNormal(vNormal[nN3-1]);

			glm::vec3 up = glm::vec3(0, 1, 0);
			if(glm::abs(glm::normalize(vNormal[nN1-1])) != up){
				m_vShape[nGroupIndex].AddVertexTangent(glm::cross(vNormal[nN1-1], up));
			}else{
				m_vShape[nGroupIndex].AddVertexTangent(glm::vec3(1, 0, 0));
			}
			if(glm::abs(glm::normalize(vNormal[nN2-1])) != up){
				m_vShape[nGroupIndex].AddVertexTangent(glm::cross(vNormal[nN2-1], up));
			}else{
				m_vShape[nGroupIndex].AddVertexTangent(glm::vec3(1, 0, 0));
			}
			if(glm::abs(glm::normalize(vNormal[nN3-1])) != up){
				m_vShape[nGroupIndex].AddVertexTangent(glm::cross(vNormal[nN3-1], up));
			}else{
				m_vShape[nGroupIndex].AddVertexTangent(glm::vec3(1, 0, 0));
			}

			m_vShape[nGroupIndex].m_nMaterialIndex = nMaterial;
		}
#pragma endregion
#pragma region Material Library
		else if(sWord == "mtllib")
		{
			sscanf_s(reader.m_sLine.c_str(), "mtllib %s", sTemp, reader.m_sLine.size());
			LoadMTL(static_cast<String>(sTemp));
		}
#pragma endregion
#pragma region Use Material
		else if(sWord == "usemtl")
		{
			sscanf_s(reader.m_sLine.c_str(), "usemtl %s", sTemp, reader.m_sLine.size());
			String sTempMaterial = m_sModelName + "\\" + sTemp;
			nMaterial = m_pMaterialManager->IdentifyMaterial(sTempMaterial);
		}
#pragma endregion
		delete[] sTemp;
	}
	for(unsigned int i = 0; i < m_vShape.size(); i++)
		m_vShape[i].InitGPU();
	return Results::ERROR_FREE;
}