示例#1
0
	void Sdk::Uninitialize()
	{
		if (s_referenceCounter != 1)
		{
			// Either the module is not initialized, either it was initialized multiple times
			if (s_referenceCounter > 1)
				s_referenceCounter--;

			return;
		}

		// Uninitialize the SDK
		s_referenceCounter = 0;

		// Uninitialize the engine

		#ifndef NDK_SERVER
		// Client modules
		Nz::Audio::Uninitialize();
		Nz::Graphics::Uninitialize();
		#endif

		// Shared modules
		Nz::Lua::Uninitialize();
		Nz::Noise::Uninitialize();
		Nz::Physics::Uninitialize();
		Nz::Utility::Uninitialize();

		NazaraNotice("Uninitialized: SDK");
	}
示例#2
0
	bool ModuleName::Initialize()
	{
		if (s_moduleReferenceCounter > 0)
		{
			s_moduleReferenceCounter++;
			return true; // Already initialized
		}

		// Initialize module dependencies
		if (!Core::Initialize())
		{
			NazaraError("Failed to initialize core module");
			return false;
		}

		s_moduleReferenceCounter++;

		CallOnExit onExit(ModuleName::Uninitialize);

		// Initialize module here

		onExit.Reset();

		NazaraNotice("Initialized: ModuleName module");
		return true;
	}
示例#3
0
bool NzAudio::Initialize()
{
	if (s_moduleReferenceCounter++ != 0)
		return true; // Déjà initialisé

	// Initialisation des dépendances
	if (!NzCore::Initialize())
	{
		NazaraError("Failed to initialize core module");
		Uninitialize();

		return false;
	}

	// Initialisation d'OpenGL
	if (!NzOpenAL::Initialize())
	{
		NazaraError("Failed to initialize OpenAL");
		Uninitialize();

		return false;
	}

	// Définition de l'orientation par défaut
	SetListenerDirection(NzVector3f::Forward());

	// Loaders
	NzLoaders_sndfile_Register();

	NazaraNotice("Initialized: Audio module");

	return true;
}
示例#4
0
void NzUtility::Uninitialize()
{
	if (s_moduleReferenceCounter != 1)
	{
		// Le module est soit encore utilisé, soit pas initialisé
		if (s_moduleReferenceCounter > 1)
			s_moduleReferenceCounter--;

		return;
	}

	// Libération du module
	s_moduleReferenceCounter = 0;

	NzLoaders_MD2_Unregister();
	NzLoaders_MD5Anim_Unregister();
	NzLoaders_MD5Mesh_Unregister();
	NzLoaders_PCX_Unregister();
	NzLoaders_STB_Unregister();

	NzWindow::Uninitialize();
	NzVertexDeclaration::Uninitialize();
	NzPixelFormat::Uninitialize();
	NzBuffer::Uninitialize();

	NazaraNotice("Uninitialized: Utility module");

	// Libération des dépendances
	NzCore::Uninitialize();
}
示例#5
0
void NzGraphics::Uninitialize()
{
	if (s_moduleReferenceCounter != 1)
	{
		// Le module est soit encore utilisé, soit pas initialisé
		if (s_moduleReferenceCounter > 1)
			s_moduleReferenceCounter--;

		return;
	}

	// Libération du module
	s_moduleReferenceCounter = 0;

	// Libération de l'atlas s'il vient de nous
	std::shared_ptr<NzAbstractAtlas> defaultAtlas = NzFont::GetDefaultAtlas();
	if (defaultAtlas && defaultAtlas->GetStorage() & nzDataStorage_Hardware)
	{
		NzFont::SetDefaultAtlas(nullptr);

		// La police par défaut peut faire vivre un atlas hardware après la libération du module (ce qui va être problématique)
		// du coup, si la police par défaut utilise un atlas hardware, on lui enlève.
		// Je n'aime pas cette solution mais je n'en ai pas de meilleure sous la main pour l'instant
		if (!defaultAtlas.unique())
		{
			// Encore au moins une police utilise l'atlas
			NzFont* defaultFont = NzFont::GetDefault();
			defaultFont->SetAtlas(nullptr);

			if (!defaultAtlas.unique())
			{
				// Toujours pas seuls propriétaires ? Ah ben zut.
				NazaraWarning("Default font atlas uses hardware storage and is still used");
			}
		}
	}

	defaultAtlas.reset();

	// Loaders
	NzLoaders_Mesh_Unregister();
	NzLoaders_OBJ_Unregister();
	NzLoaders_Texture_Unregister();

	NzDeferredRenderTechnique::Uninitialize();
	NzForwardRenderTechnique::Uninitialize();
	NzSkinningManager::Uninitialize();
	NzParticleRenderer::Uninitialize();
	NzParticleGenerator::Uninitialize();
	NzParticleDeclaration::Uninitialize();
	NzParticleController::Uninitialize();
	NzMaterial::Uninitialize();

	NazaraNotice("Uninitialized: Graphics module");

	// Libération des dépendances
	NzRenderer::Uninitialize();
}
示例#6
0
bool NzCore::Initialize()
{
	if (s_moduleReferenceCounter > 0)
	{
		s_moduleReferenceCounter++;
		return true; // Déjà initialisé
	}

	s_moduleReferenceCounter++;

	NazaraNotice("Initialized: Core");
	return true;
}
示例#7
0
bool NzLua::Initialize()
{
	if (s_moduleReferenceCounter++ != 0)
		return true; // Déjà initialisé

	// Initialisation des dépendances
	if (!NzCore::Initialize())
	{
		NazaraError("Failed to initialize core module");
		return false;
	}

	// Initialisation du module

	NazaraNotice("Initialized: Lua module");

	return true;
}
示例#8
0
void NzLua::Uninitialize()
{
	if (s_moduleReferenceCounter != 1)
	{
		// Le module est soit encore utilisé, soit pas initialisé
		if (s_moduleReferenceCounter > 1)
			s_moduleReferenceCounter--;

		return;
	}

	// Libération du module
	s_moduleReferenceCounter = 0;

	NazaraNotice("Uninitialized: Lua module");

	// Libération des dépendances
	NzCore::Uninitialize();
}
示例#9
0
void NzCore::Uninitialize()
{
	if (s_moduleReferenceCounter != 1)
	{
		// Le module est soit encore utilisé, soit pas initialisé
		if (s_moduleReferenceCounter > 1)
			s_moduleReferenceCounter--;

		return;
	}

	// Libération du module
	s_moduleReferenceCounter = 0;

	NzHardwareInfo::Uninitialize();
	NzPluginManager::Uninitialize();
	NzTaskScheduler::Uninitialize();

	NazaraNotice("Uninitialized: Core");
}
示例#10
0
	void ModuleName::Uninitialize()
	{
		if (s_moduleReferenceCounter != 1)
		{
			// Either the module is not initialized, either it was initialized multiple times
			if (s_moduleReferenceCounter > 1)
				s_moduleReferenceCounter--;

			return;
		}

		s_moduleReferenceCounter = 0;

		// Uninitialize module here

		NazaraNotice("Uninitialized: ModuleName module");

		// Free module dependencies
		Core::Uninitialize();
	}
示例#11
0
bool NzPhysics::Initialize()
{
	if (s_moduleReferenceCounter > 0)
	{
		s_moduleReferenceCounter++;
		return true; // Déjà initialisé
	}

	// Initialisation des dépendances
	if (!NzCore::Initialize())
	{
		NazaraError("Failed to initialize core module");
		return false;
	}

	s_moduleReferenceCounter++;

	// Initialisation du module

	NazaraNotice("Initialized: Physics module");
	return true;
}
示例#12
0
	void Network::Uninitialize()
	{
		if (s_moduleReferenceCounter != 1)
		{
			// Either the module is not initialized, either it was initialized multiple times
			if (s_moduleReferenceCounter > 1)
				s_moduleReferenceCounter--;

			return;
		}

		s_moduleReferenceCounter = 0;

		// Uninitialize module here
		NetPacket::Uninitialize();
		SocketImpl::Uninitialize();

		NazaraNotice("Uninitialized: Network module");

		// Free module dependencies
		Core::Uninitialize();
	}
示例#13
0
	bool Network::Initialize()
	{
		if (s_moduleReferenceCounter > 0)
		{
			s_moduleReferenceCounter++;
			return true; // Already initialized
		}

		// Initialize module dependencies
		if (!Core::Initialize())
		{
			NazaraError("Failed to initialize core module");
			return false;
		}

		s_moduleReferenceCounter++;

		CallOnExit onExit(Network::Uninitialize);

		// Initialize module here
		if (!SocketImpl::Initialize())
		{
			NazaraError("Failed to initialize socket implementation");
			return false;
		}

		if (!NetPacket::Initialize())
		{
			NazaraError("Failed to initialize packets");
			return false;
		}

		onExit.Reset();

		NazaraNotice("Initialized: Network module");
		return true;
	}
示例#14
0
void NzAudio::Uninitialize()
{
	if (s_moduleReferenceCounter != 1)
	{
		// Le module est soit encore utilisé, soit pas initialisé
		if (s_moduleReferenceCounter > 1)
			s_moduleReferenceCounter--;

		return;
	}

	// Libération du module
	s_moduleReferenceCounter = 0;

	// Loaders
	NzLoaders_sndfile_Unregister();

	NzOpenAL::Uninitialize();

	NazaraNotice("Uninitialized: Audio module");

	// Libération des dépendances
	NzCore::Uninitialize();
}
示例#15
0
bool NzGraphics::Initialize()
{
	if (s_moduleReferenceCounter > 0)
	{
		s_moduleReferenceCounter++;
		return true; // Déjà initialisé
	}

	// Initialisation des dépendances
	if (!NzRenderer::Initialize())
	{
		NazaraError("Failed to initialize Renderer module");
		return false;
	}

	s_moduleReferenceCounter++;

	// Initialisation du module
	NzCallOnExit onExit(NzGraphics::Uninitialize);

	if (!NzMaterial::Initialize())
	{
		NazaraError("Failed to initialize materials");
		return false;
	}

	if (!NzParticleController::Initialize())
	{
		NazaraError("Failed to initialize particle controllers");
		return false;
	}

	if (!NzParticleDeclaration::Initialize())
	{
		NazaraError("Failed to initialize particle declarations");
		return false;
	}

	if (!NzParticleGenerator::Initialize())
	{
		NazaraError("Failed to initialize particle generators");
		return false;
	}

	if (!NzParticleRenderer::Initialize())
	{
		NazaraError("Failed to initialize particle renderers");
		return false;
	}

	if (!NzSkinningManager::Initialize())
	{
		NazaraError("Failed to initialize skinning manager");
		return false;
	}

	// Loaders
	NzLoaders_OBJ_Register();

	// Loaders génériques
	NzLoaders_Mesh_Register();
	NzLoaders_Texture_Register();

	// RenderTechniques
	if (!NzForwardRenderTechnique::Initialize())
	{
		NazaraError("Failed to initialize Forward Rendering");
		return false;
	}

	NzRenderTechniques::Register(NzRenderTechniques::ToString(nzRenderTechniqueType_BasicForward), 0, []() -> NzAbstractRenderTechnique* { return new NzForwardRenderTechnique; });

	if (NzDeferredRenderTechnique::IsSupported())
	{
		if (NzDeferredRenderTechnique::Initialize())
			NzRenderTechniques::Register(NzRenderTechniques::ToString(nzRenderTechniqueType_DeferredShading), 20, []() -> NzAbstractRenderTechnique* { return new NzDeferredRenderTechnique; });
		else
		{
			NazaraWarning("Failed to initialize Deferred Rendering");
		}
	}

	NzFont::SetDefaultAtlas(std::make_shared<NzGuillotineTextureAtlas>());

	onExit.Reset();

	NazaraNotice("Initialized: Graphics module");
	return true;
}
示例#16
0
	bool Sdk::Initialize()
	{
		if (s_referenceCounter++ > 0)
			return true; // Already initialized

		try
		{
			Nz::ErrorFlags errFlags(Nz::ErrorFlag_ThrowException, true);

			// Initialize the engine first

			// Shared modules
			Nz::Lua::Initialize();
			Nz::Noise::Initialize();
			Nz::Physics::Initialize();
			Nz::Utility::Initialize();

			#ifndef NDK_SERVER
			// Client modules
			Nz::Audio::Initialize();
			Nz::Graphics::Initialize();
			#endif

			// SDK Initialization

			// Components
			BaseComponent::Initialize();

			// Shared components
			InitializeComponent<CollisionComponent>("NdkColli");
			InitializeComponent<NodeComponent>("NdkNode");
			InitializeComponent<PhysicsComponent>("NdkPhys");
			InitializeComponent<VelocityComponent>("NdkVeloc");

			#ifndef NDK_SERVER
			// Client components
			InitializeComponent<CameraComponent>("NdkCam");
			InitializeComponent<LightComponent>("NdkLight");
			InitializeComponent<ListenerComponent>("NdkList");
			InitializeComponent<GraphicsComponent>("NdkGfx");
			#endif

			// Systems

			BaseSystem::Initialize();

			// Shared systems
			InitializeSystem<PhysicsSystem>();
			InitializeSystem<VelocitySystem>();

			#ifndef NDK_SERVER
			// Client systems
			InitializeSystem<ListenerSystem>();
			InitializeSystem<RenderSystem>();
			#endif

			NazaraNotice("Initialized: SDK");
			return true;
		}
		catch (const std::exception& e)
		{
			NazaraError("Failed to initialize NDK: " + Nz::String(e.what()));

			return false;
		}
	}
	bool Graphics::Initialize()
	{
		if (IsInitialized())
		{
			s_moduleReferenceCounter++;
			return true; // Already initialized
		}

		// Initialisation of dependances
		if (!Renderer::Initialize())
		{
			NazaraError("Failed to initialize Renderer module");
			return false;
		}

		s_moduleReferenceCounter++;

		// Initialisation of the module
		CallOnExit onExit(Graphics::Uninitialize);

		// Materials
		if (!MaterialPipeline::Initialize())
		{
			NazaraError("Failed to initialize material pipelines");
			return false;
		}

		if (!Material::Initialize())
		{
			NazaraError("Failed to initialize materials");
			return false;
		}

		// Renderables
		if (!ParticleController::Initialize())
		{
			NazaraError("Failed to initialize particle controllers");
			return false;
		}

		if (!ParticleDeclaration::Initialize())
		{
			NazaraError("Failed to initialize particle declarations");
			return false;
		}

		if (!ParticleGenerator::Initialize())
		{
			NazaraError("Failed to initialize particle generators");
			return false;
		}

		if (!ParticleRenderer::Initialize())
		{
			NazaraError("Failed to initialize particle renderers");
			return false;
		}

		if (!SkinningManager::Initialize())
		{
			NazaraError("Failed to initialize skinning manager");
			return false;
		}

		if (!SkyboxBackground::Initialize())
		{
			NazaraError("Failed to initialize skybox backgrounds");
			return false;
		}

		if (!Sprite::Initialize())
		{
			NazaraError("Failed to initialize sprites");
			return false;
		}

		if (!TileMap::Initialize())
		{
			NazaraError("Failed to initialize tilemaps");
			return false;
		}

		// Generic loaders
		Loaders::RegisterMesh();
		Loaders::RegisterTexture();

		// Render techniques
		if (!DepthRenderTechnique::Initialize())
		{
			NazaraError("Failed to initialize Depth Rendering");
			return false;
		}

		if (!ForwardRenderTechnique::Initialize())
		{
			NazaraError("Failed to initialize Forward Rendering");
			return false;
		}

		RenderTechniques::Register(RenderTechniques::ToString(RenderTechniqueType_BasicForward), 0, []() -> AbstractRenderTechnique* { return new ForwardRenderTechnique; });

		if (DeferredRenderTechnique::IsSupported())
		{
			if (DeferredRenderTechnique::Initialize())
				RenderTechniques::Register(RenderTechniques::ToString(RenderTechniqueType_DeferredShading), 20, []() -> AbstractRenderTechnique* { return new DeferredRenderTechnique; });
			else
			{
				NazaraWarning("Failed to initialize Deferred Rendering");
			}
		}

		Font::SetDefaultAtlas(std::make_shared<GuillotineTextureAtlas>());

		// Textures
		std::array<UInt8, 6> whitePixels = { { 255, 255, 255, 255, 255, 255 } };

		Nz::TextureRef whiteTexture = Nz::Texture::New();
		whiteTexture->Create(ImageType_2D, PixelFormatType_L8, 1, 1);
		whiteTexture->Update(whitePixels.data());

		TextureLibrary::Register("White2D", std::move(whiteTexture));

		Nz::TextureRef whiteCubemap = Nz::Texture::New();
		whiteCubemap->Create(ImageType_Cubemap, PixelFormatType_L8, 1, 1);
		whiteCubemap->Update(whitePixels.data());

		TextureLibrary::Register("WhiteCubemap", std::move(whiteCubemap));

		onExit.Reset();

		NazaraNotice("Initialized: Graphics module");
		return true;
	}
	void Graphics::Uninitialize()
	{
		if (s_moduleReferenceCounter != 1)
		{
			// The module is still in use, or can not be uninitialized
			if (s_moduleReferenceCounter > 1)
				s_moduleReferenceCounter--;

			return;
		}

		// Free of module
		s_moduleReferenceCounter = 0;

		// Free of atlas if it is ours
		std::shared_ptr<AbstractAtlas> defaultAtlas = Font::GetDefaultAtlas();
		if (defaultAtlas && defaultAtlas->GetStorage() == DataStorage_Hardware)
		{
			Font::SetDefaultAtlas(nullptr);

			// The default police can make live one hardware atlas after the free of a module (which could be problematic)
			// So, if the default police use a hardware atlas, we stole it.
			// I don't like this solution, but I don't have any better
			if (!defaultAtlas.unique())
			{
				// Still at least one police use the atlas
				Font* defaultFont = Font::GetDefault();
				defaultFont->SetAtlas(nullptr);

				if (!defaultAtlas.unique())
				{
					// Still not the only one to own it ? Then crap.
					NazaraWarning("Default font atlas uses hardware storage and is still used");
				}
			}
		}

		defaultAtlas.reset();

		// Textures
		TextureLibrary::Unregister("White2D");
		TextureLibrary::Unregister("WhiteCubemap");

		// Loaders
		Loaders::UnregisterMesh();
		Loaders::UnregisterTexture();

		// Renderables
		ParticleRenderer::Uninitialize();
		ParticleGenerator::Uninitialize();
		ParticleDeclaration::Uninitialize();
		ParticleController::Uninitialize();
		SkyboxBackground::Uninitialize();
		Sprite::Uninitialize();
		TileMap::Uninitialize();

		// Render techniques
		DeferredRenderTechnique::Uninitialize();
		DepthRenderTechnique::Uninitialize();
		ForwardRenderTechnique::Uninitialize();
		SkinningManager::Uninitialize();

		// Materials
		Material::Uninitialize();
		MaterialPipeline::Uninitialize();

		NazaraNotice("Uninitialized: Graphics module");

		// Free of dependances
		Renderer::Uninitialize();
	}
示例#19
0
bool NzUtility::Initialize()
{
	if (s_moduleReferenceCounter++ != 0)
		return true; // Déjà initialisé

	// Initialisation des dépendances
	if (!NzCore::Initialize())
	{
		NazaraError("Failed to initialize core module");
		Uninitialize();

		return false;
	}

	// Initialisation du module
	#if NAZARA_UTILITY_MULTITHREADED_SKINNING
	if (!NzTaskScheduler::Initialize())
	{
		NazaraError("Failed to initialize task scheduler");
		Uninitialize();

		return false;
	}
	#endif

	if (!NzBuffer::Initialize())
	{
		NazaraError("Failed to initialize buffers");
		Uninitialize();

		return false;
	}

	if (!NzPixelFormat::Initialize())
	{
		NazaraError("Failed to initialize pixel formats");
		Uninitialize();

		return false;
	}

	if (!NzVertexDeclaration::Initialize())
	{
		NazaraError("Failed to initialize vertex declarations");
		Uninitialize();

		return false;
	}

	if (!NzWindow::Initialize())
	{
		NazaraError("Failed to initialize window's system");
		Uninitialize();

		return false;
	}

	// On enregistre les loaders pour les extensions
	// Il s'agit ici d'une liste LIFO, le dernier loader enregistré possède la priorité

	/// Loaders génériques
	// Image
	NzLoaders_STB_Register(); // Loader générique (STB)

	/// Loaders spécialisés
	// Animation
	NzLoaders_MD5Anim_Register(); // Loader de fichiers .md5anim (v10)

	// Mesh
	NzLoaders_MD2_Register(); // Loader de fichiers .md2 (v8)
	NzLoaders_MD5Mesh_Register(); // Loader de fichiers .md5mesh (v10)

	// Image
	NzLoaders_PCX_Register(); // Loader de fichiers .pcx (1, 4, 8, 24 bits)

	NazaraNotice("Initialized: Utility module");

	return true;
}