Panagiotis Christopoulos Charitos пре 1 месец
родитељ
комит
bdad9a68eb

+ 1 - 3
AnKi/Core/App.cpp

@@ -398,9 +398,7 @@ Error App::mainLoop()
 	if(CString(g_cvarCoreStartupScene) != "")
 	{
 		ANKI_LOGI("Will load scene: %s", CString(g_cvarCoreStartupScene).cstr());
-		ScriptResourcePtr script;
-		ANKI_CHECK(ResourceManager::getSingleton().loadResource(g_cvarCoreStartupScene, script));
-		ANKI_CHECK(ScriptManager::getSingleton().evalString(script->getSource()));
+		ANKI_CHECK(SceneGraph::getSingleton().loadFromFile(g_cvarCoreStartupScene));
 	}
 
 	// Continue with the main loop

+ 1 - 1
AnKi/Editor/EditorUi.cpp

@@ -432,7 +432,7 @@ void EditorUi::mainMenu()
 		{
 			if(ImGui::Button(ICON_MDI_CONTENT_SAVE_ALL))
 			{
-				if(SceneGraph::getSingleton().saveToTextFile("./scene.ankiscene"))
+				if(SceneGraph::getSingleton().saveToFile("./Scene.ankiscene"))
 				{
 					ANKI_LOGE("Failed to save scene");
 				}

+ 19 - 2
AnKi/Resource/ResourceFilesystem.cpp

@@ -293,9 +293,26 @@ Error ResourceFilesystem::addNewPath(CString filepath, const ResourceStringList&
 
 	U32 fileCount = 0; // Count files manually because it's slower to get that number from the list
 	ResourceStringList filenameList;
-	constexpr CString extension(".ankizip");
+	constexpr CString archiveExtension(".ankizip");
+	constexpr CString allowedExtensions[] = {".ankiprog", ".ankiprogbin", ".ankitex", ".ankimtl", ".ankimesh", ".ankiskel", ".ankianim", ".ankiscene",
+											 ".ankipart", ".png",         ".jpg",     ".jpeg",    ".tga",      ".lua",      ".ttf"};
 
 	auto includePath = [&](CString p) -> Bool {
+		Bool extensionGood = false;
+		for(CString allowedExtension : allowedExtensions)
+		{
+			if(p.find(allowedExtension) != CString::kNpos)
+			{
+				extensionGood = true;
+				break;
+			}
+		}
+
+		if(!extensionGood)
+		{
+			return false;
+		}
+
 		for(const ResourceString& s : excludedStrings)
 		{
 			const Bool found = p.find(s) != CString::kNpos;
@@ -324,7 +341,7 @@ Error ResourceFilesystem::addNewPath(CString filepath, const ResourceStringList&
 
 	PtrSize pos;
 	Path path;
-	if((pos = filepath.find(extension)) != CString::kNpos && pos == filepath.getLength() - extension.getLength())
+	if((pos = filepath.find(archiveExtension)) != CString::kNpos && pos == filepath.getLength() - archiveExtension.getLength())
 	{
 		// It's an archive
 

+ 1 - 0
AnKi/Scene/Components/SceneComponent.cpp

@@ -14,6 +14,7 @@ SceneComponent::SceneComponent([[maybe_unused]] SceneNode* node, SceneComponentT
 {
 	ANKI_ASSERT(uuid);
 	ANKI_ASSERT(SceneComponentType(m_type) < SceneComponentType::kCount);
+	m_serialize = kSceneComponentTypeInfos[m_type].m_serializable;
 }
 
 } // namespace anki

+ 8 - 4
AnKi/Scene/Components/SceneComponent.h

@@ -172,13 +172,17 @@ public:
 
 	void setSerialization(Bool enable)
 	{
-		ANKI_ASSERT(!enable || kSceneComponentTypeInfos[m_type].m_serializable);
-		m_serialize = enable;
+		if(ANKI_EXPECT(!enable || kSceneComponentTypeInfos[m_type].m_serializable))
+		{
+			m_serialize = enable;
+		}
 	}
 
 	Bool getSerialization() const
 	{
-		return m_serialize;
+		const Bool serialize = m_serialize;
+		ANKI_ASSERT(!serialize || kSceneComponentTypeInfos[m_type].m_serializable);
+		return serialize;
 	}
 
 protected:
@@ -236,7 +240,7 @@ protected:
 private:
 	Timestamp m_timestamp = 1; // Indicates when an update happened
 	U32 m_uuid : 31 = 0;
-	U32 m_serialize : 1 = kSceneComponentTypeInfos[m_type].m_serializable;
+	U32 m_serialize : 1 = false;
 
 	U32 m_arrayIdx : 24 = kMaxU32 >> 8u;
 	U32 m_type : 8 = 0; // Cache the type ID.

+ 31 - 11
AnKi/Scene/SceneGraph.cpp

@@ -11,7 +11,10 @@
 #include <AnKi/Core/StatsSet.h>
 #include <AnKi/Util/Tracer.h>
 #include <AnKi/Util/HighRezTimer.h>
+#include <AnKi/Util/FileSystem.h>
 #include <AnKi/Core/App.h>
+#include <AnKi/Resource/ScriptResource.h>
+#include <AnKi/Script/ScriptManager.h>
 #include <AnKi/Scene/StatsUiNode.h>
 #include <AnKi/Scene/DeveloperConsoleUiNode.h>
 #include <AnKi/Scene/EditorUiNode.h>
@@ -536,7 +539,7 @@ void SceneGraph::updateNodes(U32 tid, UpdateSceneNodesCtx& ctx)
 const SceneNode& SceneGraph::getActiveCameraNode() const
 {
 	ANKI_ASSERT(m_mainCam);
-	if(ANKI_EXPECT(m_mainCam->hasComponent<CameraComponent>()))
+	if(ANKI_EXPECT(m_mainCam->hasComponent<CameraComponent>()) && !g_cvarCoreShowEditor)
 	{
 		return *m_mainCam;
 	}
@@ -577,7 +580,7 @@ void SceneGraph::countSerializableNodes(SceneNode& root, U32& serializableNodeCo
 	}
 }
 
-Error SceneGraph::saveToTextFile(CString filename)
+Error SceneGraph::saveToFile(CString filename)
 {
 	ANKI_TRACE_FUNCTION();
 
@@ -588,10 +591,11 @@ Error SceneGraph::saveToTextFile(CString filename)
 	File file;
 	ANKI_CHECK(file.open(filename, FileOpenFlag::kWrite));
 
-	TextSceneSerializer serializer(&file, true);
+	TextSceneSerializer serializer(&file);
 
 	// Header
-	ANKI_CHECK(file.writeText("ANKISCEN\n"));
+	SceneString magic = "ANKISCEN";
+	ANKI_SERIALIZE(magic, 1);
 	U32 version = kSceneBinaryVersion;
 	ANKI_SERIALIZE(version, 1);
 
@@ -700,21 +704,36 @@ Error SceneGraph::saveToTextFile(CString filename)
 	return Error::kNone;
 }
 
-Error SceneGraph::loadFromTextFile(CString filename)
+Error SceneGraph::loadFromFile(CString filename)
 {
 	ANKI_TRACE_FUNCTION();
 
+	const U64 begin = HighRezTimer::getCurrentTimeUs();
+
 	ANKI_LOGI("Loading scene: %s", filename.cstr());
 
-	File file;
-	ANKI_CHECK(file.open(filename, FileOpenFlag::kRead));
+	String extension;
+	getFilepathExtension(filename, extension);
+
+	if(extension == "lua")
+	{
+		ScriptResourcePtr script;
+		ANKI_CHECK(ResourceManager::getSingleton().loadResource(filename, script));
+		ANKI_CHECK(ScriptManager::getSingleton().evalString(script->getSource()));
+
+		ANKI_SCENE_LOGI("Loading scene finished. %fms", F64(HighRezTimer::getCurrentTimeUs() - begin) / 1000.0);
+		return Error::kNone;
+	}
+
+	ResourceFilePtr file;
+	ANKI_CHECK(ResourceFilesystem::getSingleton().openFile(filename, file));
 
-	TextSceneSerializer serializer(&file, true);
+	TextSceneSerializer serializer(file.get());
 
 	// Header
-	Array<Char, 9> magic;
-	ANKI_CHECK(file.read(magic.getBegin(), magic.getSize()));
-	if(CString("ANKISCEN\n") != magic.getBegin())
+	SceneString magic;
+	ANKI_SERIALIZE(magic, 1);
+	if(magic != "ANKISCEN")
 	{
 		ANKI_LOGE("Wrong magic value");
 		return Error::kUserData;
@@ -800,6 +819,7 @@ Error SceneGraph::loadFromTextFile(CString filename)
 	}
 #include <AnKi/Scene/Components/SceneComponentClasses.def.h>
 
+	ANKI_SCENE_LOGI("Loading scene finished. %fms", F64(HighRezTimer::getCurrentTimeUs() - begin) / 1000.0);
 	return Error::kNone;
 }
 

+ 2 - 2
AnKi/Scene/SceneGraph.h

@@ -177,9 +177,9 @@ public:
 		m_checkForResourceUpdates = enable;
 	}
 
-	Error saveToTextFile(CString filename);
+	Error saveToFile(CString filename);
 
-	Error loadFromTextFile(CString filename);
+	Error loadFromFile(CString filename);
 
 private:
 	class UpdateSceneNodesCtx;

+ 4 - 4
AnKi/Scene/SceneSerializer.cpp

@@ -46,13 +46,13 @@ Error SceneSerializer::read(CString name, WeakArray<F64> values)
 
 Error TextSceneSerializer::parseCurrentLine(SceneStringList& tokens, CString fieldName, U32 checkTokenCount)
 {
-	if(m_linesIt == m_lines.getEnd())
+	if(m_read.m_linesIt == m_read.m_lines.getEnd())
 	{
 		ANKI_SERIALIZER_LOGE("Can't read next line");
 		return Error::kUserData;
 	}
 
-	const SceneString& line = *m_linesIt;
+	const SceneString& line = *m_read.m_linesIt;
 	tokens.splitString(line, ' ');
 	if(tokens.getSize() == 0)
 	{
@@ -74,8 +74,8 @@ Error TextSceneSerializer::parseCurrentLine(SceneStringList& tokens, CString fie
 		return Error::kUserData;
 	}
 
-	++m_linesIt;
-	++m_lineno;
+	++m_read.m_linesIt;
+	++m_read.m_lineno;
 
 	return Error::kNone;
 }

+ 38 - 25
AnKi/Scene/SceneSerializer.h

@@ -180,7 +180,8 @@ public:
 	}
 };
 
-#define ANKI_SERIALIZER_LOGE(...) ANKI_SCENE_LOGE("%s", (SceneString().sprintf(__VA_ARGS__) + SceneString().sprintf(". Line %u: ", m_lineno)).cstr())
+#define ANKI_SERIALIZER_LOGE(...) \
+	ANKI_SCENE_LOGE("%s", (SceneString().sprintf(__VA_ARGS__) + SceneString().sprintf(". Line %u: ", m_read.m_lineno)).cstr())
 #define ANKI_SERIALIZER_CHECK(expr) \
 	do \
 	{ \
@@ -196,32 +197,36 @@ public:
 class TextSceneSerializer : public SceneSerializer
 {
 public:
-	TextSceneSerializer(File* file, Bool writingMode)
-		: SceneSerializer(writingMode)
-		, m_file(*file)
+	// Write mode
+	TextSceneSerializer(File* file)
+		: SceneSerializer(true)
 	{
-		if(!m_writeMode)
-		{
-			SceneString txt;
-			ANKI_CHECKF(file->readAllText(txt));
+		m_write.m_file = file;
+	}
 
-			m_lines.splitString(txt, '\n');
-			m_linesIt = m_lines.getBegin();
-		}
+	// Read mode
+	TextSceneSerializer(ResourceFile* file)
+		: SceneSerializer(false)
+	{
+		ResourceString txt;
+		ANKI_CHECKF(file->readAllText(txt));
+
+		m_read.m_lines.splitString(txt, '\n');
+		m_read.m_linesIt = m_read.m_lines.getBegin();
 	}
 
 	Error write(CString name, ConstWeakArray<U32> values) final
 	{
 		if(values.getSize() == 1)
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %u\n", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %u\n", name.cstr(), values[0]));
 		}
 		else
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %u ", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %u ", name.cstr(), values[0]));
 			for(U32 i = 1; i < values.getSize(); ++i)
 			{
-				ANKI_CHECK(m_file.writeTextf((i < values.getSize() - 1) ? "%u " : "%u\n", values[i]));
+				ANKI_CHECK(m_write.m_file->writeTextf((i < values.getSize() - 1) ? "%u " : "%u\n", values[i]));
 			}
 		}
 		return Error::kNone;
@@ -245,14 +250,14 @@ public:
 	{
 		if(values.getSize() == 1)
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %d\n", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %d\n", name.cstr(), values[0]));
 		}
 		else
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %d ", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %d ", name.cstr(), values[0]));
 			for(U32 i = 1; i < values.getSize(); ++i)
 			{
-				ANKI_CHECK(m_file.writeTextf((i < values.getSize() - 1) ? "%d " : "%d\n", values[i]));
+				ANKI_CHECK(m_write.m_file->writeTextf((i < values.getSize() - 1) ? "%d " : "%d\n", values[i]));
 			}
 		}
 		return Error::kNone;
@@ -276,14 +281,14 @@ public:
 	{
 		if(values.getSize() == 1)
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %f\n", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %f\n", name.cstr(), values[0]));
 		}
 		else
 		{
-			ANKI_CHECK(m_file.writeTextf("%s %f ", name.cstr(), values[0]));
+			ANKI_CHECK(m_write.m_file->writeTextf("%s %f ", name.cstr(), values[0]));
 			for(U32 i = 1; i < values.getSize(); ++i)
 			{
-				ANKI_CHECK(m_file.writeTextf((i < values.getSize() - 1) ? "%f " : "%f\n", values[i]));
+				ANKI_CHECK(m_write.m_file->writeTextf((i < values.getSize() - 1) ? "%f " : "%f\n", values[i]));
 			}
 		}
 		return Error::kNone;
@@ -305,7 +310,7 @@ public:
 
 	Error write(CString name, CString value) final
 	{
-		return m_file.writeTextf("%s %s\n", name.cstr(), value.cstr());
+		return m_write.m_file->writeTextf("%s %s\n", name.cstr(), value.cstr());
 	}
 
 	Error read([[maybe_unused]] CString name, [[maybe_unused]] SceneString& value) final
@@ -323,11 +328,19 @@ public:
 	}
 
 private:
-	File& m_file;
+	class
+	{
+	public:
+		File* m_file = nullptr;
+	} m_write;
 
-	SceneStringList m_lines;
-	SceneStringList::Iterator m_linesIt;
-	U32 m_lineno = 0;
+	class
+	{
+	public:
+		SceneStringList m_lines;
+		SceneStringList::Iterator m_linesIt;
+		U32 m_lineno = 0;
+	} m_read;
 
 	Error parseCurrentLine(SceneStringList& tokens, CString fieldName, U32 checkTokenCount = kMaxU32);
 };

+ 0 - 1
Samples/Sponza/Main.cpp

@@ -3,7 +3,6 @@
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 
-#include <cstdio>
 #include <Samples/Common/SampleApp.h>
 
 using namespace anki;