Browse Source

Adding support for fog volumes

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
c0402961b6

+ 10 - 0
include/anki/renderer/MainRenderer.h

@@ -50,6 +50,16 @@ public:
 
 	F32 getAspectRatio() const;
 
+	const Renderer& getOffscreenRenderer() const
+	{
+		return *m_r;
+	}
+
+	Renderer& getOffscreenRenderer()
+	{
+		return *m_r;
+	}
+
 private:
 	HeapAllocator<U8> m_alloc;
 	StackAllocator<U8> m_frameAlloc;

+ 1 - 1
include/anki/renderer/Ms.h

@@ -46,7 +46,7 @@ anki_internal:
 		return m_planes[1].m_rt2;
 	}
 
-	TexturePtr& getDepthRt()
+	TexturePtr getDepthRt() const
 	{
 		return m_planes[1].m_depthRt;
 	}

+ 17 - 3
include/anki/resource/ResourceManager.h

@@ -19,6 +19,7 @@ class PhysicsWorld;
 class ResourceManager;
 class AsyncLoader;
 class ResourceManagerModel;
+class Renderer;
 
 /// @addtogroup resource
 /// @{
@@ -104,6 +105,9 @@ class ResourceManager:
 	TypeResourceManager<CollisionResource>,
 	TypeResourceManager<GenericResource>
 {
+	template<typename T>
+	friend class ResourcePtrDeleter;
+
 public:
 	class Initializer
 	{
@@ -134,8 +138,7 @@ public:
 	ANKI_USE_RESULT Error loadResourceToCache(
 		ResourcePtr<T>& out, TArgs&&... args);
 
-	/// @privatesection
-	/// @{
+anki_internal:
 	U32 getMaxTextureSize() const
 	{
 		return m_maxTextureSize;
@@ -185,6 +188,17 @@ public:
 		m_shadersPrependedSource.create(m_alloc, cstr);
 	}
 
+	void setRenderer(Renderer* r)
+	{
+		m_r = r;
+	}
+
+	const Renderer& getRenderer() const
+	{
+		ANKI_ASSERT(m_r);
+		return *m_r;
+	}
+
 	const String& _getShadersPrependedSource() const
 	{
 		return m_shadersPrependedSource;
@@ -212,12 +226,12 @@ public:
 	{
 		return *m_asyncLoader;
 	}
-	/// @}
 
 private:
 	GrManager* m_gr = nullptr;
 	PhysicsWorld* m_physics = nullptr;
 	ResourceFilesystem* m_fs = nullptr;
+	Renderer* m_r = nullptr;
 	ResourceAllocator<U8> m_alloc;
 	TempResourceAllocator<U8> m_tmpAlloc;
 	String m_cacheDir;

+ 1 - 0
src/core/App.cpp

@@ -285,6 +285,7 @@ Error App::createInternal(const ConfigSet& config_,
 
 	m_resources->_setShadersPrependedSource(
 		m_renderer->getMaterialShaderSource().toCString());
+	m_resources->setRenderer(&m_renderer->getOffscreenRenderer());
 
 	// Scene
 	m_scene = m_heapAlloc.newInstance<SceneGraph>();

+ 1 - 1
src/renderer/Dbg.cpp

@@ -153,7 +153,7 @@ Error Dbg::run(CommandBufferPtr& cmdb)
 	}
 #endif
 
-#if 1
+#if 0
 	{
 		Vec4 origin(0.0);
 

+ 3 - 0
src/renderer/Drawer.cpp

@@ -204,6 +204,9 @@ public:
 				uniSet(glvar, &tess, 1);
 			}
 			break;
+		case BuildinMaterialVariableId::MS_DEPTH_MAP:
+			// Do nothing
+			break;
 		default:
 			ANKI_ASSERT(0);
 			break;

+ 14 - 2
src/resource/Material.cpp

@@ -14,6 +14,8 @@
 #include "anki/util/File.h"
 #include "anki/util/Filesystem.h"
 #include "anki/misc/Xml.h"
+#include "anki/renderer/Renderer.h"
+#include "anki/renderer/Ms.h"
 #include <algorithm>
 #include <sstream>
 
@@ -28,6 +30,7 @@ class UpdateTexturesVisitor
 {
 public:
 	ResourceGroupInitializer* m_init = nullptr;
+	ResourceManager* m_manager = nullptr;
 
 	template<typename TMaterialVariableTemplate>
 	Error visit(const TMaterialVariableTemplate& var)
@@ -43,8 +46,16 @@ Error UpdateTexturesVisitor
 	::visit<MaterialVariableTemplate<TextureResourcePtr>>(
 	const MaterialVariableTemplate<TextureResourcePtr>& var)
 {
-	m_init->m_textures[var.getTextureUnit()].m_texture =
-		(*var.begin())->getGrTexture();
+	if(var.getName() == "uMsDepthMap")
+	{
+		m_init->m_textures[var.getTextureUnit()].m_texture =
+			m_manager->getRenderer().getMs().getDepthRt();
+	}
+	else
+	{
+		m_init->m_textures[var.getTextureUnit()].m_texture =
+			(*var.begin())->getGrTexture();
+	}
 	return ErrorCode::NONE;
 }
 
@@ -457,6 +468,7 @@ void Material::fillResourceGroupInitializer(ResourceGroupInitializer& rcinit)
 {
 	UpdateTexturesVisitor visitor;
 	visitor.m_init = &rcinit;
+	visitor.m_manager = &getManager();
 
 	for(const auto& var : m_vars)
 	{

+ 2 - 2
testapp/Main.cpp

@@ -275,8 +275,8 @@ Error init()
 			"models/fog/volumetric_fog_box.ankimdl");
 		MoveComponent& move = fog->getComponent<MoveComponent>();
 		//move.setLocalOrigin(Vec4(10.0, -19.0, 0.0, 0.0));
-		move.setLocalOrigin(Vec4(10.0, -16.5, 0.0, 0.0));
-		move.setLocalScale(20.0);
+		move.setLocalOrigin(Vec4(10.0, -26.5, 0.0, 0.0));
+		move.setLocalScale(100.0);
 	}
 #endif
 

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit 3fb1f5ec550ec682577229142f7cd3ffad6508dc
+Subproject commit e2fb80214db01c4822c5353cabf3d2cc397c73c5

+ 14 - 4
tools/scene/Exporter.cpp

@@ -732,10 +732,20 @@ void Exporter::exportModel(const Model& model) const
 	}
 
 	// Write material
-	file << "\t\t\t<material>" << m_rpath
-		<< getMaterialName(getMaterialAt(model.m_materialIndex),
-			model.m_instancesCount)
-		<< ".ankimtl</material>\n";
+	const aiMaterial& mtl = *m_scene->mMaterials[model.m_materialIndex];
+	if(mtl.mAnKiProperties.find("material_override")
+		== mtl.mAnKiProperties.end())
+	{
+		file << "\t\t\t<material>" << m_rpath
+			<< getMaterialName(getMaterialAt(model.m_materialIndex),
+				model.m_instancesCount)
+			<< ".ankimtl</material>\n";
+	}
+	else
+	{
+		file << "\t\t\t<material>"
+			<< mtl.mAnKiProperties.at("material_override") << "</material>\n";
+	}
 
 	// End patches
 	file << "\t\t</modelPatch>\n";