Przeglądaj źródła

Working on Model

Panagiotis Christopoulos Charitos 15 lat temu
rodzic
commit
a2e18d87f8
3 zmienionych plików z 111 dodań i 5 usunięć
  1. 0 0
      build/debug/Makefile
  2. 98 0
      src/Resources/Model.cpp
  3. 13 5
      src/Resources/Model.h

Plik diff jest za duży
+ 0 - 0
build/debug/Makefile


+ 98 - 0
src/Resources/Model.cpp

@@ -0,0 +1,98 @@
+#include "Model.h"
+#include "Parser.h"
+#include "Material.h"
+#include "Mesh.h"
+
+
+//======================================================================================================================
+// load                                                                                                                =
+//======================================================================================================================
+void Model::load(const char* filename)
+{
+	Scanner scanner(filename);
+	const Scanner::Token* token = &scanner.getCrntToken();
+
+	while(true)
+	{
+		scanner.getNextToken();
+
+		//
+		// subModels
+		//
+		if(Parser::isIdentifier(token, "subModels"))
+		{
+			// {
+			scanner.getNextToken();
+			if(token->getCode() != Scanner::TC_LBRACKET)
+			{
+				throw PARSER_EXCEPTION_EXPECTED("{");
+			}
+
+			// For all subModels
+			while(true)
+			{
+				scanner.getNextToken();
+
+				if(token->getCode() == Scanner::TC_RBRACKET)
+				{
+					break;
+				}
+				else if(Parser::isIdentifier(token, "subModel"))
+				{
+					parseSubModel(scanner);
+				}
+				else
+				{
+					throw PARSER_EXCEPTION_EXPECTED("{ or subModel");
+				}
+			} // End for all subModels
+		}
+		//
+		// EOF
+		//
+		else if(token->getCode() == Scanner::TC_EOF)
+		{
+			break;
+		}
+		//
+		// other crap
+		//
+		else
+		{
+			throw PARSER_EXCEPTION_UNEXPECTED();
+		}
+	} // end while
+}
+
+
+//======================================================================================================================
+// parseSubModel                                                                                                       =
+//======================================================================================================================
+void Model::parseSubModel(Scanner& scanner)
+{
+	const Scanner::Token* token = &scanner.getCrntToken();
+
+	scanner.getNextToken();
+
+	if(token->getCode() != Scanner::TC_LBRACKET)
+	{
+		throw PARSER_EXCEPTION_EXPECTED("{");
+	}
+
+	Parser::parseIdentifier(scanner, "mesh");
+	std::string mesh = Parser::parseString(scanner);
+
+	Parser::parseIdentifier(scanner, "material");
+	std::string material = Parser::parseString(scanner);
+
+	Parser::parseIdentifier(scanner, "dpMaterial");
+	std::string dpMaterial = Parser::parseString(scanner);
+
+	// Load the stuff
+	subModels.push_back(SubModel());
+	SubModel& subModel = subModels.back();
+
+	subModel.mesh.loadRsrc(mesh.c_str());
+	subModel.mtl.loadRsrc(material.c_str());
+	subModel.dpMtl.loadRsrc(dpMaterial.c_str());
+}

+ 13 - 5
src/Resources/Model.h

@@ -10,18 +10,21 @@ class Material;
 class Vao;
 class Skeleton;
 class SkelAnim;
+class Scanner;
 
 
+/// Model is an entity that acts as a container for other resources. Models are all the non static objects in a map.
+///
 /// File format:
 /// @code
-/// subMeshes {
-/// 	subMesh {
+/// subModels {
+/// 	subModel {
 /// 		mesh <string>
 /// 		material <string>
 /// 		dpMaterial <string>
 /// 	}
 /// 	...
-/// 	subMesh {
+/// 	subModel {
 /// 		...
 /// 	}
 /// }
@@ -40,6 +43,8 @@ class Model: public Resource
 		///
 		class SubModel
 		{
+			friend class Model;
+
 			public:
 				/// @name Accessors
 				/// @{
@@ -63,8 +68,11 @@ class Model: public Resource
 		void load(const char* filename);
 
 	private:
-		RsrcPtr<Skeleton> skel;
-		Vec<RsrcPtr<SkelAnim> > sAnims;
+		Vec<SubModel> subModels;
+		RsrcPtr<Skeleton> skel; ///< The skeleton. It can be empty
+		Vec<RsrcPtr<SkelAnim> > sAnims; ///< The standard skeleton animations
+
+		void parseSubModel(Scanner& scanner);
 };
 
 

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików