Browse Source

Merge branch 'master' into preview

BearishSun 9 năm trước cách đây
mục cha
commit
b7da68c4a4

+ 5 - 3
Documentation/GitHub/install.md

@@ -2,6 +2,8 @@
 
 Banshee is still in development and does not yet come with a proper installer. You will need to extract the downloaded files manually. The platform support is currently limited to Windows only, but more platforms are coming in near future.
 
-The version below is the latest one, check the git releases tags for links for older ones.
-
-[Download editor binaries (Windows x64)] (http://bearishsun.thalassa.feralhosting.com/Banshee_Win_x64_v0.3.0.zip)
+Latest version:
+ - [Editor v0.3.0 (Windows x64)] (http://bearishsun.thalassa.feralhosting.com/Banshee_Win_x64_v0.3.0.zip)
+ 
+Older versions:
+ - Check git release tags for links

+ 2 - 4
README.md

@@ -1,4 +1,4 @@
-# What is Banshee?
+# What is Banshee? 
 A high quality modern game development toolkit. It provides a **high performance multi-threaded game engine** written in C++14 that runs 2D and 3D games. The engine offers a wide variety of high level systems needed for game development, ranging from math and utility libraries, to DirectX 11 and OpenGL support all the way to input, GUI, physics, scripting and support for many popular resource formats (e.g. FBX, PNG, PSD, TTF).
 
 On top of the engine Banshee also provides a highly intuitive and customizable **editor** that is easy to use by artists, designers and programmers alike. The editor allows you to manage all your project's assets, build levels, compile scripts, test and publish your game. Editor is also fully extensible via scripting to ensure developers can easily customize for the exact needs of their projects.
@@ -28,6 +28,4 @@ Aside from being a fully featured game engine and toolkit, Banshee also aims to
 [Link] (https://youtu.be/WJsYOyCXGEU)
 
 # Author
-Banshee was created and is developed by Marko Pintera. The goal of Banshee is to create a high quality open source game engine that is intuitive to use and easy to extend.
-
-I'm happy to connect with other developers, feel free to contact me at [email protected] or add me on [LinkedIn] (https://goo.gl/t6pPPs). 
+Banshee was created and is developed by Marko Pintera. I'm happy to connect with other developers, feel free to contact me at [email protected] or add me on [LinkedIn] (https://goo.gl/t6pPPs). 

+ 7 - 6
Scripts/package_editor.py

@@ -7,14 +7,14 @@
 # Usage: "package_editor $Configuration"
 # Where: $Configuration - e.g. Debug, OptimizedDebug
 
-# TODO: Don't package Settings.asset, Game binaries, Example binaries
-
 import os
 import sys
 import shutil
 
 configuration = 'OptimizedDebug' #sys.argv[1]
-dataFoldersToIgnore = ['Examples', 'Raw']
+dataEntriesToIgnore = ['Examples', 'Raw', 'Settings.asset']
+binEntriesToIgnore = ['Game.exe', 'Game.pdb', 'ExampleProject.exe', 'ExampleProject.pdb',
+                      'BansheeD3D9RenderAPI.dll', 'BansheeD3D9RenderAPI.pdb']
 
 dataFolder = 'Data'
 assembliesFolder = 'Assemblies'
@@ -38,7 +38,7 @@ def ignore_data(path, entries):
     if path != inputDataFolder:
         return []
 
-    return list(set(dataFoldersToIgnore) & set(entries))    
+    return list(set(dataEntriesToIgnore) & set(entries))    
 
 def package_editor():
     if os.path.exists(outputBaseFolder):
@@ -52,7 +52,8 @@ def package_editor():
     for root, dirs, files in os.walk(inputLibFolder):
         for file in files:
             if(file.lower().endswith(('.dll', '.exe', '.pdb', '.so'))):
-                filePath = os.path.join(root, file)
-                shutil.copy(filePath, outputLibFolder)
+                if(not file in binEntriesToIgnore):
+                    filePath = os.path.join(root, file)
+                    shutil.copy(filePath, outputLibFolder)
 
 package_editor()

+ 3 - 17
Source/BansheeEngine/Source/BsCamera.cpp

@@ -727,11 +727,7 @@ namespace BansheeEngine
 		mRecalcFrustumPlanes = true;
 		mRecalcView = true;
 
-		if (dirtyFlag == CameraDirtyFlag::Transform)
-		{
-			RendererManager::instance().getActive()->notifyCameraUpdated(this, (UINT32)dirtyFlag);
-		}
-		else 
+		if (dirtyFlag != CameraDirtyFlag::Transform)
 		{
 			dataPtr = rttiReadElem(mLayers, dataPtr);
 			dataPtr = rttiReadElem(mProjType, dataPtr);
@@ -748,19 +744,9 @@ namespace BansheeEngine
 			dataPtr = rttiReadElem(mIsActive, dataPtr);
 			dataPtr = rttiReadElem(mMSAA, dataPtr);
 			dataPtr = rttiReadElem(mPPSettings, dataPtr);
-
-			if(dirtyFlag == CameraDirtyFlag::PostProcess)
-			{
-				RendererManager::instance().getActive()->notifyCameraUpdated(this, (UINT32)dirtyFlag);
-			}
-			else
-			{
-				RendererManager::instance().getActive()->notifyCameraRemoved(this);
-
-				if (mIsActive)
-					RendererManager::instance().getActive()->notifyCameraAdded(this);
-			}
 		}
+
+		RendererManager::instance().getActive()->notifyCameraUpdated(this, (UINT32)dirtyFlag);
 	}
 
 	Camera::Camera(SPtr<RenderTarget> target, float left, float top, float width, float height)

+ 2 - 2
Source/BansheeGLRenderAPI/Include/BsGLRenderTexture.h

@@ -29,13 +29,13 @@ namespace BansheeEngine
 		virtual ~GLRenderTextureCore();
 
 		/** @copydoc RenderTextureCore::getCustomAttribute */
-		virtual void getCustomAttribute(const String& name, void* data) const override;
+		void getCustomAttribute(const String& name, void* data) const override;
 
 	protected:
 		friend class GLRenderTexture;
 
 		/** @copydoc RenderTextureCore::initialize */
-		virtual void initialize() override;
+		void initialize() override;
 
 		/** @copydoc RenderTextureCore::getProperties */
 		const RenderTargetProperties& getPropertiesInternal() const override { return mProperties; }

+ 9 - 0
Source/RenderBeast/Include/BsRenderBeast.h

@@ -159,6 +159,15 @@ namespace BansheeEngine
 		/** @copydoc Renderer::notifyRenderableRemoved */
 		void notifyRenderableRemoved(RenderableCore* renderable) override;
 
+		/** 
+		 * Updates (or adds) renderer specific data for the specified camera. Should be called whenever camera properties
+		 * change. 
+		 *
+		 * @param[in]	camera		Camera whose data to update.
+		 * @param[in]	forceRemove	If true, the camera data will be removed instead of updated.
+		 */
+		void updateCameraData(const CameraCore* camera, bool forceRemove = false);
+
 		/**
 		 * Updates the render options on the core thread.
 		 *

+ 1 - 1
Source/RenderBeast/Include/BsRenderTargets.h

@@ -88,7 +88,7 @@ namespace BansheeEngine
 		SPtr<RenderTextureCore> mSceneColorRT;
 
 		PixelFormat mSceneColorFormat;
-		PixelFormat mDiffuseFormat;
+		PixelFormat mAlbedoFormat;
 		PixelFormat mNormalFormat;
 		UINT32 mNumSamples;
 		bool mHDR;

+ 73 - 48
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -328,68 +328,52 @@ namespace BansheeEngine
 
 	void RenderBeast::notifyCameraAdded(const CameraCore* camera)
 	{
-		SPtr<RenderTargetCore> renderTarget = camera->getViewport()->getTarget();
-		if (renderTarget == nullptr)
-			return;
-
-		CameraData& camData = mCameraData[camera];
-		camData.opaqueQueue = bs_shared_ptr_new<RenderQueue>(mCoreOptions->stateReductionMode);
-
-		StateReduction transparentStateReduction = mCoreOptions->stateReductionMode;
-		if (transparentStateReduction == StateReduction::Material)
-			transparentStateReduction = StateReduction::Distance; // Transparent object MUST be sorted by distance
-
-		camData.transparentQueue = bs_shared_ptr_new<RenderQueue>(transparentStateReduction);
-		camData.postProcessInfo.settings = camera->getPostProcessSettings();
-		camData.postProcessInfo.settingDirty = true;
-
-		// Register in render target list
-		auto findIter = std::find_if(mRenderTargets.begin(), mRenderTargets.end(), 
-			[&](const RenderTargetData& x) { return x.target == renderTarget; });
+		updateCameraData(camera);
+	}
 
-		if (findIter != mRenderTargets.end())
+	void RenderBeast::notifyCameraUpdated(const CameraCore* camera, UINT32 updateFlag)
+	{
+		if((updateFlag & (UINT32)CameraDirtyFlag::Everything) != 0)
 		{
-			findIter->cameras.push_back(camera);
+			updateCameraData(camera);
 		}
-		else
+		else if((updateFlag & (UINT32)CameraDirtyFlag::PostProcess) != 0)
 		{
-			mRenderTargets.push_back(RenderTargetData());
-			RenderTargetData& renderTargetData = mRenderTargets.back();
-
-			renderTargetData.target = renderTarget;
-			renderTargetData.cameras.push_back(camera);
-		}
-
-		// Sort render targets based on priority
-		auto cameraComparer = [&](const CameraCore* a, const CameraCore* b) { return a->getPriority() > b->getPriority(); };
-		auto renderTargetInfoComparer = [&](const RenderTargetData& a, const RenderTargetData& b)
-		{ return a.target->getProperties().getPriority() > b.target->getProperties().getPriority(); };
-		std::sort(begin(mRenderTargets), end(mRenderTargets), renderTargetInfoComparer);
-
-		for (auto& camerasPerTarget : mRenderTargets)
-		{
-			Vector<const CameraCore*>& cameras = camerasPerTarget.cameras;
+			CameraData& camData = mCameraData[camera];
+			camData.postProcessInfo.settings = camera->getPostProcessSettings();
+			camData.postProcessInfo.settingDirty = true;
+		} 
+	}
 
-			std::sort(begin(cameras), end(cameras), cameraComparer);
-		}
+	void RenderBeast::notifyCameraRemoved(const CameraCore* camera)
+	{
+		updateCameraData(camera, true);
 	}
 
-	void RenderBeast::notifyCameraUpdated(const CameraCore* camera, UINT32 updateFlag)
+	void RenderBeast::updateCameraData(const CameraCore* camera, bool forceRemove)
 	{
-		CameraDirtyFlag dirtyFlag = (CameraDirtyFlag)updateFlag;
-		if(dirtyFlag == CameraDirtyFlag::PostProcess)
+		SPtr<RenderTargetCore> renderTarget = camera->getViewport()->getTarget();
+		if(forceRemove)
+		{
+			mCameraData.erase(camera);
+			renderTarget = nullptr;
+		}
+		else
 		{
 			CameraData& camData = mCameraData[camera];
+			camData.opaqueQueue = bs_shared_ptr_new<RenderQueue>(mCoreOptions->stateReductionMode);
+
+			StateReduction transparentStateReduction = mCoreOptions->stateReductionMode;
+			if (transparentStateReduction == StateReduction::Material)
+				transparentStateReduction = StateReduction::Distance; // Transparent object MUST be sorted by distance
+
+			camData.transparentQueue = bs_shared_ptr_new<RenderQueue>(transparentStateReduction);
 			camData.postProcessInfo.settings = camera->getPostProcessSettings();
 			camData.postProcessInfo.settingDirty = true;
 		}
-	}
-
-	void RenderBeast::notifyCameraRemoved(const CameraCore* camera)
-	{
-		mCameraData.erase(camera);
 
 		// Remove from render target list
+		int rtChanged = 0; // 0 - No RT, 1 - RT found, 2 - RT changed
 		for (auto iterTarget = mRenderTargets.begin(); iterTarget != mRenderTargets.end(); ++iterTarget)
 		{
 			RenderTargetData& target = *iterTarget;
@@ -397,7 +381,15 @@ namespace BansheeEngine
 			{
 				if (camera == *iterCam)
 				{
-					target.cameras.erase(iterCam);
+					if (renderTarget != target.target)
+					{
+						target.cameras.erase(iterCam);
+						rtChanged = 2;
+
+					}
+					else
+						rtChanged = 1;
+
 					break;
 				}
 			}
@@ -408,6 +400,39 @@ namespace BansheeEngine
 				break;
 			}
 		}
+
+		// Register in render target list
+		if (renderTarget != nullptr && (rtChanged == 0 || rtChanged == 2))
+		{
+			auto findIter = std::find_if(mRenderTargets.begin(), mRenderTargets.end(),
+				[&](const RenderTargetData& x) { return x.target == renderTarget; });
+
+			if (findIter != mRenderTargets.end())
+			{
+				findIter->cameras.push_back(camera);
+			}
+			else
+			{
+				mRenderTargets.push_back(RenderTargetData());
+				RenderTargetData& renderTargetData = mRenderTargets.back();
+
+				renderTargetData.target = renderTarget;
+				renderTargetData.cameras.push_back(camera);
+			}
+
+			// Sort render targets based on priority
+			auto cameraComparer = [&](const CameraCore* a, const CameraCore* b) { return a->getPriority() > b->getPriority(); };
+			auto renderTargetInfoComparer = [&](const RenderTargetData& a, const RenderTargetData& b)
+			{ return a.target->getProperties().getPriority() > b.target->getProperties().getPriority(); };
+			std::sort(begin(mRenderTargets), end(mRenderTargets), renderTargetInfoComparer);
+
+			for (auto& camerasPerTarget : mRenderTargets)
+			{
+				Vector<const CameraCore*>& cameras = camerasPerTarget.cameras;
+
+				std::sort(begin(cameras), end(cameras), cameraComparer);
+			}
+		}
 	}
 
 	void RenderBeast::setOptions(const SPtr<CoreRendererOptions>& options)

+ 7 - 3
Source/RenderBeast/Source/BsRenderTargets.cpp

@@ -14,7 +14,7 @@ namespace BansheeEngine
 	{
 		// Note: Consider customizable HDR format via options? e.g. smaller PF_FLOAT_R11G11B10 or larger 32-bit format
 		mSceneColorFormat = hdr ? PF_FLOAT16_RGBA : PF_B8G8R8A8;
-		mDiffuseFormat = PF_B8G8R8X8; // Note: Also consider customizable format (e.g. 16-bit float?)
+		mAlbedoFormat = PF_B8G8R8X8; // Note: Also consider customizable format (e.g. 16-bit float?)
 		mNormalFormat = PF_UNORM_R10G10B10A2; // Note: Also consider customizable format (e.g. 16-bit float?)
 	}
 
@@ -30,10 +30,14 @@ namespace BansheeEngine
 		UINT32 width = getWidth();
 		UINT32 height = getHeight();
 
+		// Note: Albedo is allocated as SRGB, meaning when reading from textures during depth pass we decode from sRGB into linear,
+		// then back into sRGB when writing to albedo, and back to linear when reading from albedo during light pass. This /might/ have
+		// a performance impact. In which case we could just use a higher precision albedo buffer, which can then store linear color
+		// directly (storing linear in 8bit buffer causes too much detail to be lost in the blacks).
 		SPtr<PooledRenderTexture> newColorRT = texPool.get(POOLED_RENDER_TEXTURE_DESC::create2D(mSceneColorFormat, width, height, TU_RENDERTARGET,
 			mNumSamples, false));
-		SPtr<PooledRenderTexture> newAlbedoRT = texPool.get(POOLED_RENDER_TEXTURE_DESC::create2D(mDiffuseFormat, width, 
-			height, TU_RENDERTARGET, mNumSamples, false));
+		SPtr<PooledRenderTexture> newAlbedoRT = texPool.get(POOLED_RENDER_TEXTURE_DESC::create2D(mAlbedoFormat, width, 
+			height, TU_RENDERTARGET, mNumSamples, true));
 		SPtr<PooledRenderTexture> newNormalRT = texPool.get(POOLED_RENDER_TEXTURE_DESC::create2D(mNormalFormat, width, 
 			height, TU_RENDERTARGET, mNumSamples, false));
 		SPtr<PooledRenderTexture> newDepthRT = texPool.get(POOLED_RENDER_TEXTURE_DESC::create2D(PF_D24S8, width, height,